• 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:个人理解是,从原图中,截取指定矩形区域的内容

    在这里插入图片描述

     在这里插入图片描述

    代码例子:

    chunfen1.png原图

    Logo.png原图

     

     

    1. using Emgu.CV;
    2. using Emgu.CV.Structure;
    3. using Emgu.CV.Util;
    4. using System;
    5. using System.Collections.Generic;
    6. using System.IO;
    7. using System.Linq;
    8. using System.Text;
    9. using System.Threading.Tasks;
    10. namespace EmguCVDemo2
    11. {
    12. class Program
    13. {
    14. static void Main(string[] args)
    15. {
    16. Mat srcPic = new Mat("chunfen1.png");
    17. Mat logo = new Mat("Logo.png");
    18. ROITest(srcPic, logo);
    19. CvInvoke.WaitKey(0);
    20. Console.ReadLine();
    21. }
    22. private static void ROITest(Mat srcPic, Mat logo)
    23. {
    24. Mat imgROI = new Mat(srcPic, new System.Drawing.Rectangle(20, 20, logo.Cols, logo.Rows));
    25. CvInvoke.Imshow("imgROI", imgROI);
    26. CvInvoke.WaitKey(0);
    27. }
    28. }
    29. }

     运行结果如下:

     

    mask遮罩

    在这里插入图片描述 

    初级融入:个人理解是,把一张小的图片(一般为Logo图片),原封不动地替换到原图ROI对应的位置

    代码如下:

    1. using Emgu.CV;
    2. using Emgu.CV.Structure;
    3. using Emgu.CV.Util;
    4. using System;
    5. using System.Collections.Generic;
    6. using System.IO;
    7. using System.Linq;
    8. using System.Text;
    9. using System.Threading.Tasks;
    10. namespace EmguCVDemo2
    11. {
    12. class Program
    13. {
    14. static void Main(string[] args)
    15. {
    16. Mat srcPic = new Mat("chunfen1.png");
    17. Mat logo = new Mat("Logo.png");
    18. PrimaryROI(srcPic, logo);
    19. CvInvoke.WaitKey(0);
    20. Console.ReadLine();
    21. }
    22. ///
    23. /// 初级融合
    24. ///
    25. ///
    26. ///
    27. public static void PrimaryROI(Mat srcPic,Mat logo)
    28. {
    29. Mat imgROI = new Mat(srcPic, new System.Drawing.Rectangle(20, 20, logo.Cols, logo.Rows));
    30. logo.CopyTo(imgROI);
    31. CvInvoke.Imshow("srcPic", srcPic);
    32. CvInvoke.WaitKey(0);
    33. }
    34. }
    35. }

     运行结果如下图:

    看到没有,把Logo图塞进原来ROI的位置了

    圆形融合:个人理解是把遮罩的形状变成圆形,看起来圆滑一点

    代码如下:

    1. using Emgu.CV;
    2. using Emgu.CV.Structure;
    3. using Emgu.CV.Util;
    4. using System;
    5. using System.Collections.Generic;
    6. using System.IO;
    7. using System.Linq;
    8. using System.Text;
    9. using System.Threading.Tasks;
    10. namespace EmguCVDemo2
    11. {
    12. class Program
    13. {
    14. static void Main(string[] args)
    15. {
    16. Mat srcPic = new Mat("chunfen1.png");
    17. Mat logo = new Mat("Logo.png");
    18. CicleROI(srcPic, logo);
    19. CvInvoke.WaitKey(0);
    20. Console.ReadLine();
    21. }
    22. ///
    23. /// 圆形ROI
    24. ///
    25. ///
    26. ///
    27. private static void CicleROI(Mat srcPic, Mat logo)
    28. {
    29. Mat imgROI = new Mat(srcPic, new System.Drawing.Rectangle(20, 20, logo.Cols, logo.Rows));
    30. //定义了一个长为logo.Cols,宽为logo.Rows的矩形遮罩
    31. Mat mask = Mat.Zeros(logo.Rows, logo.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 3);
    32. CvInvoke.Imshow("mask_rec", mask);
    33. 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);
    34. CvInvoke.Imshow("draw_cicle", mask);
    35. logo.CopyTo(imgROI, mask);
    36. CvInvoke.Imshow("srcPic", srcPic);
    37. CvInvoke.WaitKey(0);
    38. }
    39. }
    40. }

    运行结果如下图:

    高级融合:个人理解是把一张图(一般为Logo图)塞进另外一张图,Logo图比较特别,背景色一般为纯色(白色),然后把Logo取反后二值化,即把背景色去掉了,只留下Logo重要的内容

    代码如下:

    1. using Emgu.CV;
    2. using Emgu.CV.Structure;
    3. using Emgu.CV.Util;
    4. using System;
    5. using System.Collections.Generic;
    6. using System.IO;
    7. using System.Linq;
    8. using System.Text;
    9. using System.Threading.Tasks;
    10. namespace EmguCVDemo2
    11. {
    12. class Program
    13. {
    14. static void Main(string[] args)
    15. {
    16. Mat srcPic = new Mat("chunfen1.png");
    17. Mat logo = new Mat("Logo.png");
    18. HightROI(srcPic, logo);
    19. CvInvoke.WaitKey(0);
    20. Console.ReadLine();
    21. }
    22. ///
    23. /// 高级融入
    24. ///
    25. ///
    26. ///
    27. public static void HightROI(Mat srcPic, Mat logo)
    28. {
    29. Mat imgROI = new Mat(srcPic, new System.Drawing.Rectangle(20, 20, logo.Cols, logo.Rows));
    30. Mat mask = logo.Clone();
    31. //对遮罩取反
    32. CvInvoke.BitwiseNot(mask, mask);
    33. //对遮罩进行二值化处理
    34. CvInvoke.Threshold(mask, mask, 100, 255, Emgu.CV.CvEnum.ThresholdType.Binary);
    35. CvInvoke.Imshow("mask", mask);
    36. logo.CopyTo(imgROI,mask);
    37. CvInvoke.Imshow("srcPic", srcPic);
    38. CvInvoke.WaitKey(0);
    39. }
    40. }
    41. }

     运行结果如下图:

     

     

  • 相关阅读:
    【JAVA进阶篇教学】第三篇:JDK8中Stream API使用
    每日一题 712两个字符串的最小ASCLL删除和
    Pikachu上的CSRF以及NSSCTF上的[NISACTF 2022]bingdundun~、 [SWPUCTF 2022 新生赛]xff
    2023年java代做题目参考整理
    【电子通识】USB Logo的标识含义
    通义千问本地部署报错
    java每日一记 —— 谈谈反射
    vue静态资源的引用(相对路径,绝对路径,@,~的一些笔记,以图片引入为例,含在线演示)
    深度学习目标检测——AP以及MAP
    QT子线程或自定义类操作访问主界面UI控件的几种方法
  • 原文地址:https://blog.csdn.net/zxy13826134783/article/details/127736228