C# EmguCV学习笔记(一)---图像加减法操作

图像加法:

使用Image.Add()方法,可以让两张图片相加,或者让当前图像加上一个色彩值,另外你也可以使用CvInvoke.Add()方法执行相同的操作。

Image.Add()方法内部就是调用CvInvoke.Add()方法实现的。

Image.Add()有3个实现,每个实现的返回都是一个相同色彩空间、值类型的Image对象:

/// 当前图片与另外一张图片相加,另外一张图片必须与当前图片是相同的类型和尺寸(或相同ROI尺寸) 
2       ///与当前图片相加的图片
3       /// 相加的结果
4       public Image Add(Image img2)


/// 当前图片与另外一张图片相加(ret(I)=src1(I)+src2(I) if mask(I)!=0),另外一张图片必须与当前图片是相同的类型和尺寸(或形同ROI尺寸)
2       ///另一张图片
3       ///掩膜图片
4       /// 使用掩膜图片相加的结果
5       public Image Add(Image img2, Image mask)


/// 当前图片加上一个色彩值 
2       /// 色彩值 
3       /// 相加的结果  from the current image
4       public Image Add(TColor val)

在设计界面添加4个pictureBox控件,用来显示处理的图片:

C# EmguCV学习笔记(一)---图像加减法操作_第1张图片


转到代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.Util;
namespace 图像ROI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //Image image1 = new Image(Properties.Resources._2);
            //Image image2 = new Image(Properties.Resources._22);

        }
        #region
        ///
        ///两张图片相加
        ///
        ///相加的图片1
        ///相加的图片2
        ///
        public static Image JustAdd(Imageimage1,Imageimage2)
        {
            return image1.Add(image2);
        }
        #endregion

        #region
        ///
        ///使用掩码进行图像操作
        ///
        ///相加的图片1
        ///相加的图片2
        ///
        public static Image AddUsingMask(Image image1,Image image2)
        {
            var rect = new Rectangle(new Point(0, 0), new Size(image1.Width / 2, image1.Height));
            using (var mask = new Image(image1.Size))
            {
                mask.SetZero();//设置所有的值为0
                mask.ROI = rect;
                mask.SetValue(255);//设置ROI的值为255
                mask.ROI = Rectangle.Empty;//去掉ROI
                //if mask(I)!=0,res(I)=img1(I)+img2(I);
                var resImage = image1.Add(image2, mask);
                mask._Not();//反转
                image1.Copy(resImage, mask); //if mask(I) != 0,把image1的值拷贝到resImage中
                return resImage;
            }
        }

        #endregion

        private void Form1_Load(object sender, EventArgs e)
        {
            Image image1 = new Image(Properties.Resources._2);
            Image image2 = new Image(Properties.Resources._22);
            pictureBox1.Image = image1.ToBitmap();
            pictureBox2.Image = image2.ToBitmap();
            pictureBox3.Image = JustAdd(image1, image2).ToBitmap();
            pictureBox4.Image = AddUsingMask(image1, image2).ToBitmap();

            //创建掩模图片
            var mask = new Image(image2.Size);
            mask.SetZero();
            mask.ROI = new Rectangle(new Point(0, 0), new Size(image2.Width / 2, image2.Height));//ROI,就是选择显示区域
            mask.SetValue(255);
            mask.ROI = Rectangle.Empty;//去掉选择ROI
            //pictureBox3.Image = mask.ToBitmap();
        }
    }
}

显示结果如下:

C# EmguCV学习笔记(一)---图像加减法操作_第2张图片


图像减法:

使用Image.Sub(),可以让当前图像减去另外一个图像,或者当前图像减去另外一个值。也可以使用CvInvoke.Subtract()方法执行相同的操作。

Image.Sub()方法内部就是调用CvInvoke.Subtract()方法实现的。

与加法相似,Image.Sub()同样有3个实现,每个实现的返回都是一个相同色彩控件、值类型的Image对象。

/// 当前图片减去一张图片,被减图片必须与当前图片是相同的类型和尺寸(或相同的ROI尺寸) 
2        ///被减图片
3        /// 相减的结果
4        public Image Sub(Image img2)
/// 当前图片减去另外一张图片(ret(I)=src1(I)-src2(I) if mask(I)!=0),被减图片必须与当前图片是相同的类型和尺寸(或相同的ROI尺寸) 
2        ///被减图片
3        ///掩膜图片
4        /// 使用掩膜图片相减的结果
5        public Image Sub(Image img2, Image mask)
 /// 当前图片减去一个色彩值
2        ///被减去的色彩值
3        /// 减去色彩值的结果
4        public Image Sub(TColor val) 


在Form1中调用以上方法,在加法中可以得到更亮的图片,减法中得到更暗的图像。

代码实现:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.Util;
namespace 图像减法
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        #region 图像减法
        ///
        ///图像减法
        ///
        ///相减的图片1
        ///相减的图片2
        ///
        public static Image JustSub(Image image1, Image image2)
        {
            return image1.Sub(image2);
        }
        #endregion

        #region 掩码操作
        ///
        ///在掩码图片的条件下,用image1-image2
        ///>
        ///
        ///
        ///
        public static Image SubUsingMask(Imageimage1,Imageimage2)
        {
            var rect = new Rectangle(new Point(0, 0), new Size(image1.Width / 2, image1.Height));
            using (var mask = new Image(image1.Size))
            {
                mask.SetZero();
                mask.ROI = rect;
                mask.SetValue(255);
                mask.ROI = Rectangle.Empty;
                var resImage = image1.Sub(image2, mask);
                mask._Not();
                image1.Copy(resImage, mask);
                return resImage;
            }
        }
        #endregion

        private void Form1_Load(object sender, EventArgs e)
        {
            Image image1 = new Image(Properties.Resources._2);
            Image image2 = new Image(Properties.Resources._22);
            pictureBox1.Image = image1.ToBitmap();
            pictureBox2.Image = image2.ToBitmap();
            pictureBox3.Image = JustSub(image1, image2).ToBitmap();

            pictureBox4.Image = SubUsingMask(image1, image2).ToBitmap();
        }
    }

}


处理结果:

C# EmguCV学习笔记(一)---图像加减法操作_第3张图片


你可能感兴趣的:(C#,EmguCV,C#,c#)