• Emgu CV4图像处理之膨胀和腐蚀、梯度计算、开闭运算14(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博客

    形态学图像处理包括:

     

    原理参考文章,写得还不错:

    OpenCV 图像处理之膨胀与腐蚀 - 知乎

    1  膨胀:

    这里我们指定范围为3*3的矩阵,kernel(卷积核核)指定为全为1的3*3的矩阵,卷积计算后,该像素点的值等于以该像素点为中心的3*3范围内的最大值。由于我们是二值图像,所以只要包含周围白的部分,就变为白的。

    如:

     图中的128=Max(128,0,0,0,126,24,0,0,0)

    膨胀后的效果图(相当加粗了,领域扩张了):

    Emgu CV的函数原型如下:

    src:原图

    dst:输出图

    element:操作的卷积核,可以通过 CvInvoke.GetStructuringElement获取到

    iterations:膨胀的次数

    borderType:边界模式,一般为默认Emgu.CV.CvEnum.BorderType.Default

    borderValue:边界值,一般为默认值new MCvScalar()

    代码如下:

    srcPic.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.Drawing;
    7. using System.IO;
    8. using System.Linq;
    9. using System.Text;
    10. using System.Threading.Tasks;
    11. namespace EmguCVDemo2
    12. {
    13. class Program
    14. {
    15. static void Main(string[] args)
    16. {
    17. Image srcPic = new Image("srcPic.png");
    18. ImgDilate(srcPic);
    19. CvInvoke.WaitKey(0);
    20. Console.ReadLine();
    21. }
    22. ///
    23. /// 图像膨胀
    24. ///
    25. ///
    26. private static void ImgDilate(Image srcPic)
    27. {
    28. //原图进行转换为灰度图
    29. CvInvoke.CvtColor(srcPic, srcPic, Emgu.CV.CvEnum.ColorConversion.Rgb2Gray);
    30. Mat dstPic = new Mat();
    31. Mat element = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Rectangle, new Size(3, 3), new Point(-1, -1));
    32. CvInvoke.Dilate(srcPic, dstPic, element, new Point(-1, -1), 1, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar());
    33. CvInvoke.Imshow("srcPic", srcPic);
    34. CvInvoke.Imshow("dstPic", dstPic);
    35. CvInvoke.WaitKey(0);
    36. }
    37. }
    38. }

     运行结果如下:

    2  腐蚀 

    腐蚀操作和膨胀操作相反,也就是将毛刺消除,判断方法为:在卷积核大小中对图片进行卷积。取图像中(3 * 3)区域内的最小值。由于我们是二值图像,也就是取0(黑色)。

     总结: 只要原图片3 * 3范围内有黑的,该像素点就是黑的。

    腐蚀后的效果图(相当瘦身了,领域被蚕食了):

    Emgu CV的函数原型如下:

    src:原图

    dst:输出图

    element:操作的卷积核,可以通过 CvInvoke.GetStructuringElement获取到

    iterations:膨胀的次数

    borderType:边界模式,一般为默认Emgu.CV.CvEnum.BorderType.Default

    borderValue:边界值,一般为默认值new MCvScalar()

    代码如下:

    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.Drawing;
    7. using System.IO;
    8. using System.Linq;
    9. using System.Text;
    10. using System.Threading.Tasks;
    11. namespace EmguCVDemo2
    12. {
    13. class Program
    14. {
    15. static void Main(string[] args)
    16. {
    17. Image srcPic = new Image("srcPic.png");
    18. ImgErode(srcPic);
    19. CvInvoke.WaitKey(0);
    20. Console.ReadLine();
    21. }
    22. ///
    23. /// 图像腐蚀
    24. ///
    25. ///
    26. private static void ImgErode(Image srcPic)
    27. {
    28. //原图进行转换为灰度图
    29. CvInvoke.CvtColor(srcPic, srcPic, Emgu.CV.CvEnum.ColorConversion.Rgb2Gray);
    30. Mat dstPic = new Mat();
    31. Mat element = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Rectangle, new Size(3,3), new Point(-1, -1));
    32. CvInvoke.Erode(srcPic, dstPic, element, new Point(-1, -1), 1, Emgu.CV.CvEnum.BorderType.Default,new MCvScalar());
    33. CvInvoke.Imshow("srcPic", srcPic);
    34. CvInvoke.Imshow("dstPic", dstPic);
    35. CvInvoke.WaitKey(0);
    36. }
    37. }
    38. }

    运行结果:

    3   形态学函数Morphology

    函数原型:

    src:原图

    dst:输出图

    operation:形态学的运算类型,如下图:

    kernel:操作的卷积核,可以通过 CvInvoke.GetStructuringElement获取到

    anchor:一般为new Point(-1, -1)

    iterations:膨胀的次数

    borderType:边界模式,一般为默认Emgu.CV.CvEnum.BorderType.Default

    borderValue:边界值,一般为默认值new MCvScalar()

    3.1  开运算

    先腐蚀后膨胀

    实现的效果是毛刺信息在腐蚀的时候就已经消除了,膨胀也不会膨胀出多余信息

     

    参考代码如下:

    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.Drawing;
    7. using System.IO;
    8. using System.Linq;
    9. using System.Text;
    10. using System.Threading.Tasks;
    11. namespace EmguCVDemo2
    12. {
    13. class Program
    14. {
    15. static void Main(string[] args)
    16. {
    17. Image srcPic = new Image("srcPic.png");
    18. ImgOpenOperation(srcPic);
    19. CvInvoke.WaitKey(0);
    20. Console.ReadLine();
    21. }
    22. ///
    23. /// 开运算
    24. ///
    25. ///
    26. private static void ImgOpenOperation(Image srcPic)
    27. {
    28. //原图进行转换为灰度图
    29. CvInvoke.CvtColor(srcPic, srcPic, Emgu.CV.CvEnum.ColorConversion.Rgb2Gray);
    30. Mat dstPic = new Mat();
    31. Mat element = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Rectangle, new Size(3, 3), new Point(-1, -1));
    32. CvInvoke.MorphologyEx(srcPic, dstPic,Emgu.CV.CvEnum.MorphOp.Open,element, new Point(-1, -1), 1, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar());
    33. CvInvoke.Imshow("srcPic", srcPic);
    34. CvInvoke.Imshow("dstPic", dstPic);
    35. CvInvoke.WaitKey(0);
    36. }
    37. }
    38. }

    运行结果如下:

    3.2 闭运算

    先膨胀后腐蚀

    原图中内部的黑点被消除了

     

    参考代码如下:

    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.Drawing;
    7. using System.IO;
    8. using System.Linq;
    9. using System.Text;
    10. using System.Threading.Tasks;
    11. namespace EmguCVDemo2
    12. {
    13. class Program
    14. {
    15. static void Main(string[] args)
    16. {
    17. Image srcPic = new Image("srcPic.png");
    18. ImgCloseOperation(srcPic); //闭运算
    19. CvInvoke.WaitKey(0);
    20. Console.ReadLine();
    21. }
    22. ///
    23. /// 闭运算
    24. ///
    25. ///
    26. private static void ImgCloseOperation(Image srcPic)
    27. {
    28. //原图进行转换为灰度图
    29. CvInvoke.CvtColor(srcPic, srcPic, Emgu.CV.CvEnum.ColorConversion.Rgb2Gray);
    30. Mat dstPic = new Mat();
    31. Mat element = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Rectangle, new Size(3, 3), new Point(-1, -1));
    32. CvInvoke.MorphologyEx(srcPic, dstPic, Emgu.CV.CvEnum.MorphOp.Close, element, new Point(-1, -1), 1, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar());
    33. CvInvoke.Imshow("srcPic", srcPic);
    34. CvInvoke.Imshow("dstPic", dstPic);
    35. CvInvoke.WaitKey(0);
    36. }
    37. }
    38. }

    运行结果如下:

    3.3 梯度运算

    梯度计算主要显示的是边缘信息。计算的方法:

    膨胀的图像 - 腐蚀的图像

    我们明显的看出,用大一圈的图像减去小一圈的图像正好就是边缘的信息。

    参考代码如下:

    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.Drawing;
    7. using System.IO;
    8. using System.Linq;
    9. using System.Text;
    10. using System.Threading.Tasks;
    11. namespace EmguCVDemo2
    12. {
    13. class Program
    14. {
    15. static void Main(string[] args)
    16. {
    17. Image srcPic = new Image("srcPic.png");
    18. ImgGradient(srcPic);
    19. CvInvoke.WaitKey(0);
    20. Console.ReadLine();
    21. }
    22. ///
    23. /// 梯度运算(取边缘信息)
    24. ///
    25. ///
    26. private static void ImgGradient(Image srcPic)
    27. {
    28. //原图进行转换为灰度图
    29. CvInvoke.CvtColor(srcPic, srcPic, Emgu.CV.CvEnum.ColorConversion.Rgb2Gray);
    30. Mat dstPic = new Mat();
    31. Mat element = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Rectangle, new Size(3, 3), new Point(-1, -1));
    32. CvInvoke.MorphologyEx(srcPic, dstPic, Emgu.CV.CvEnum.MorphOp.Gradient, element, new Point(-1, -1), 1, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar());
    33. CvInvoke.Imshow("srcPic", srcPic);
    34. CvInvoke.Imshow("dstPic", dstPic);
    35. CvInvoke.WaitKey(0);
    36. }
    37. }
    38. }

    运行结果:

  • 相关阅读:
    【Android】adb无法连接设备原因及解决办法
    crossover23.6闪亮登场发布啦,2023最新功能解析
    HTTP 协议的基本格式和 fiddler 的用法
    C/C++数据结构——虚虚实实(并查集欧拉路)
    PyCharm配置及使用Git教程
    LabVIEW LINX Toolkit控制Arduino设备(拓展篇—1)
    QCA中质蕴项选择问题
    Python学习笔记7:入门知识(七)
    [java毕业设计源代码]精品微信小程序校园论坛系统|前后分离VUE[包运行成功]
    小李移动开发成长记 —— 大话小程序
  • 原文地址:https://blog.csdn.net/zxy13826134783/article/details/127772077