天天看點

Emgu CV4圖像處理之ROI與mask掩碼10(C#)

本文測試環境:

win10  64位

vistual studio 2019  

Emgu CV 4.6.0

環境配置準備:

1 新增控制台項目,.net framework為4.7.2

2  把win-x64目錄的native目錄下的檔案全部拷貝到項目的運作目錄Debug目錄下

3  項目選擇x64

4 添加項目引用Emgu.CV.dll、Emgu.CV.Platform.NetFramework.dll、System.Drawing.dll和System.Runtime.InteropServices.RuntimeInformation.dll  

具體配置參考:

Emgu CV4圖像處理之環境搭建1(C#)_zxy2847225301的部落格-CSDN部落格

下面内容部分參考自:

EmguCV-第11講-ROI與mask掩碼_YADONCHEN的部落格-CSDN部落格_emgucv 掩模

【OpenCV學習筆記】十三、ROI與mask掩碼_zlm丶的部落格-CSDN部落格_mask掩碼

ROI:個人了解是,從原圖中,截取指定矩形區域的内容

Emgu CV4圖像處理之ROI與mask掩碼10(C#)
Emgu CV4圖像處理之ROI與mask掩碼10(C#)

代碼例子:

chunfen1.png原圖

Emgu CV4圖像處理之ROI與mask掩碼10(C#)

Logo.png原圖

Emgu CV4圖像處理之ROI與mask掩碼10(C#)
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmguCVDemo2
{
    class Program
    {
        static void Main(string[] args)
        {

            Mat srcPic = new Mat("chunfen1.png");
            Mat logo = new Mat("Logo.png");
            ROITest(srcPic, logo);

            CvInvoke.WaitKey(0);
            Console.ReadLine();
        }


        private static void ROITest(Mat srcPic, Mat logo)
        {
            Mat imgROI = new Mat(srcPic, new System.Drawing.Rectangle(20, 20, logo.Cols, logo.Rows));
            CvInvoke.Imshow("imgROI", imgROI);
            CvInvoke.WaitKey(0);
        }
    }
}
           

 運作結果如下:

Emgu CV4圖像處理之ROI與mask掩碼10(C#)
Emgu CV4圖像處理之ROI與mask掩碼10(C#)

mask遮罩

Emgu CV4圖像處理之ROI與mask掩碼10(C#)

初級融入:個人了解是,把一張小的圖檔(一般為Logo圖檔),原封不動地替換到原圖ROI對應的位置

代碼如下:

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmguCVDemo2
{
    class Program
    {
        static void Main(string[] args)
        {

            Mat srcPic = new Mat("chunfen1.png");
            Mat logo = new Mat("Logo.png");       
            PrimaryROI(srcPic, logo);
            CvInvoke.WaitKey(0);
            Console.ReadLine();
        }


       
        /// <summary>
        /// 初級融合
        /// </summary>
        /// <param name="srcPic"></param>
        /// <param name="logo"></param>
        public static void PrimaryROI(Mat srcPic,Mat logo)
        {
            Mat imgROI = new Mat(srcPic, new System.Drawing.Rectangle(20, 20, logo.Cols, logo.Rows));
            logo.CopyTo(imgROI);
            CvInvoke.Imshow("srcPic", srcPic);
            CvInvoke.WaitKey(0);
        }

        
    }
}
           

 運作結果如下圖:

Emgu CV4圖像處理之ROI與mask掩碼10(C#)

看到沒有,把Logo圖塞進原來ROI的位置了

圓形融合:個人了解是把遮罩的形狀變成圓形,看起來圓滑一點

代碼如下:

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmguCVDemo2
{
    class Program
    {
        static void Main(string[] args)
        {

            Mat srcPic = new Mat("chunfen1.png");
            Mat logo = new Mat("Logo.png");
            
            CicleROI(srcPic, logo);
           

            CvInvoke.WaitKey(0);
            Console.ReadLine();
        }


        /// <summary>
        /// 圓形ROI
        /// </summary>
        /// <param name="srcPic"></param>
        /// <param name="logo"></param>
        private static void CicleROI(Mat srcPic, Mat logo)
        {
            Mat imgROI = new Mat(srcPic, new System.Drawing.Rectangle(20, 20, logo.Cols, logo.Rows));
            //定義了一個長為logo.Cols,寬為logo.Rows的矩形遮罩
            Mat mask = Mat.Zeros(logo.Rows, logo.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 3);
            CvInvoke.Imshow("mask_rec", mask);
            CvInvoke.Circle(mask, new System.Drawing.Point(logo.Size.Width/2, logo.Size.Height / 2), logo.Size.Width / 2, new MCvScalar(255,255,255),-1);
            CvInvoke.Imshow("draw_cicle", mask);

            logo.CopyTo(imgROI, mask);
            CvInvoke.Imshow("srcPic", srcPic);
            CvInvoke.WaitKey(0);
        }
    }
}
           

運作結果如下圖:

Emgu CV4圖像處理之ROI與mask掩碼10(C#)

進階融合:個人了解是把一張圖(一般為Logo圖)塞進另外一張圖,Logo圖比較特别,背景色一般為純色(白色),然後把Logo取反後二值化,即把背景色去掉了,隻留下Logo重要的内容

代碼如下:

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmguCVDemo2
{
    class Program
    {
        static void Main(string[] args)
        {

            Mat srcPic = new Mat("chunfen1.png");
            Mat logo = new Mat("Logo.png");
            HightROI(srcPic, logo);

            CvInvoke.WaitKey(0);
            Console.ReadLine();
        }


      

        /// <summary>
        /// 進階融入
        /// </summary>
        /// <param name="srcPic"></param>
        /// <param name="logo"></param>
        public static void  HightROI(Mat srcPic, Mat logo)
        {
            Mat imgROI = new Mat(srcPic, new System.Drawing.Rectangle(20, 20, logo.Cols, logo.Rows));
            Mat mask = logo.Clone();
            //對遮罩取反
            CvInvoke.BitwiseNot(mask, mask);
            //對遮罩進行二值化處理
            CvInvoke.Threshold(mask, mask, 100, 255, Emgu.CV.CvEnum.ThresholdType.Binary);

            CvInvoke.Imshow("mask", mask);
            logo.CopyTo(imgROI,mask);
            CvInvoke.Imshow("srcPic", srcPic);
            CvInvoke.WaitKey(0);
        }
    }
}
           

 運作結果如下圖:

Emgu CV4圖像處理之ROI與mask掩碼10(C#)

繼續閱讀