C# EmguCV學習筆記(一)---圖像加減法操作

圖像加法:

使用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();
        }
    }

}


處理結果:



發佈了56 篇原創文章 · 獲贊 72 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章