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

来源:互联网 发布:淘宝开直播需要交钱吗 编辑:程序博客网 时间:2024/05/08 19:12

图像加法:

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

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

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

///<summary> 当前图片与另外一张图片相加,另外一张图片必须与当前图片是相同的类型和尺寸(或相同ROI尺寸) </summary>2       ///<param name="img2">与当前图片相加的图片</param>3       ///<returns> 相加的结果</returns>4       public Image<TColor, TDepth> Add(Image<TColor, TDepth> img2)


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


///<summary> 当前图片加上一个色彩值 </summary>2       ///<param name="val"> 色彩值 </param>3       ///<returns> 相加的结果 <paramref name="val"/> from the current image</returns>4       public Image<TColor, TDepth> Add(TColor val)

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


转到代码:

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<Bgr, Byte> image1 = new Image<Bgr, Byte>(Properties.Resources._2);            //Image<Bgr, Byte> image2 = new Image<Bgr, Byte>(Properties.Resources._22);        }        #region        ///<summary>        ///两张图片相加        ///</summary>        ///<para name="image1">相加的图片1</param>        ///<para name="image2">相加的图片2</param>        ///<returns></returns>        public static Image<Bgr,Byte> JustAdd(Image<Bgr,Byte>image1,Image<Bgr,Byte>image2)        {            return image1.Add(image2);        }        #endregion        #region        ///<summary>        ///使用掩码进行图像操作        ///</summary>        ///<para name="image1">相加的图片1</param>        ///<para name="image2">相加的图片2</param>        ///<returns></returns>        public static Image<Bgr,Byte> AddUsingMask(Image<Bgr,Byte> image1,Image<Bgr,Byte> image2)        {            var rect = new Rectangle(new Point(0, 0), new Size(image1.Width / 2, image1.Height));            using (var mask = new Image<Gray, Byte>(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<Bgr, Byte> image1 = new Image<Bgr, Byte>(Properties.Resources._2);            Image<Bgr, Byte> image2 = new Image<Bgr, Byte>(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<Gray, Byte>(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();        }    }}

显示结果如下:


图像减法:

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

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

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

///<summary> 当前图片减去一张图片,被减图片必须与当前图片是相同的类型和尺寸(或相同的ROI尺寸) </summary>2        ///<param name="img2">被减图片</param>3        ///<returns> 相减的结果</returns>4        public Image<TColor, TDepth> Sub(Image<TColor, TDepth> img2)
///<summary> 当前图片减去另外一张图片(ret(I)=src1(I)-src2(I) if mask(I)!=0),被减图片必须与当前图片是相同的类型和尺寸(或相同的ROI尺寸) </summary>2        ///<param name="img2">被减图片</param>3        ///<param name="mask">掩膜图片</param>4        ///<returns> 使用掩膜图片相减的结果</returns>5        public Image<TColor, TDepth> Sub(Image<TColor, TDepth> img2, Image<Gray, Byte> mask)
 ///<summary> 当前图片减去一个色彩值</summary>2        ///<param name="val">被减去的色彩值</param>3        ///<returns> 减去色彩值的结果</returns>4        public Image<TColor, TDepth> 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 图像减法        ///<summary>        ///图像减法        ///</summary>        ///<para name="image1">相减的图片1</param>        ///<para name="image2">相减的图片2</param>        ///<returns></returns>        public static Image<Bgr, Byte> JustSub(Image<Bgr, Byte> image1, Image<Bgr, Byte> image2)        {            return image1.Sub(image2);        }        #endregion        #region 掩码操作        ///<summary>        ///在掩码图片的条件下,用image1-image2        ///</summary>>        ///<param name="image1"></param>        ///<param name="iamge2"></param>        ///<return></return>        public static Image<Bgr,Byte> SubUsingMask(Image<Bgr,Byte>image1,Image<Bgr,Byte>image2)        {            var rect = new Rectangle(new Point(0, 0), new Size(image1.Width / 2, image1.Height));            using (var mask = new Image<Gray, Byte>(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<Bgr, Byte> image1 = new Image<Bgr, Byte>(Properties.Resources._2);            Image<Bgr, Byte> image2 = new Image<Bgr, Byte>(Properties.Resources._22);            pictureBox1.Image = image1.ToBitmap();            pictureBox2.Image = image2.ToBitmap();            pictureBox3.Image = JustSub(image1, image2).ToBitmap();            pictureBox4.Image = SubUsingMask(image1, image2).ToBitmap();        }    }}


处理结果:



1 0
原创粉丝点击