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