图像加法:
使用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(); } } }处理结果:
