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
- C# EmguCV学习笔记(一)---图像加减法操作
- C# + WinForm + EmguCV 学习一:初步显示图像;
- EmguCV学习(一)
- c# Emgucv 图像旋转
- 【计算机视觉】EmguCV学习笔记(3)ROI区域图像叠加以及初级图像混合
- emgucv for untiy 的操作(一)
- 【计算机视觉】EmguCV学习笔记(2)图像的载入、显示和输出
- 【计算机视觉】EmguCV学习笔记(4)分离颜色通道以及多通道图像混合
- EmguCV的C#图像处理
- EmguCV的学习日志(一)
- c#与图像处理学习笔记(一)
- EmguCV学习笔记:Image
- C# + WinForm + EmguCV 学习二:创建和操作图片
- OpenCV2学习笔记(一):图像的基本操作
- openCV Python 学习笔记(一)图像的基本操作
- OpenCV学习笔记一:图像基础操作
- EmguCV入门(一)
- 【Emgucv】图像卷积(TEST)
- 第五部分 高效并发
- WPF
- NYOJ1072我想回家_最短路径
- 类和面向对象习题
- LeetCode063 Unique Paths II
- C# EmguCV学习笔记(一)---图像加减法操作
- Tomcat简介
- bzoj 4817: [Sdoi2017]树点涂色 link cut tree+线段树+树链剖分
- 路径 ssl 2651 spfa+暴力
- Pycharm下安装Anaconda 4.3.1以及在其下创建虚拟环境
- 【项目管理和构建】——Maven下载、安装和配置(二)
- 人文课(孝道)
- Java内存模型与线程
- 加密与解密(逆向常用API)