C#调用OpenCvSharp实现图像的膨胀和腐蚀

图像膨胀和腐蚀操作属于图像处理中常用的形态学操作,其原理都是采用特定小矩形(核矩形),将其中心位置与图像中的每个像素对齐后,对重合位置的像素执行特定处理后,将处理结果保存到中心位置对应的像素处(详细的图形化原理展示见操作文献7-9),膨胀和腐蚀的区别在于,前者是取重合位置的像素集合中的最大值,而后者取最小值。
  腐蚀操作可以‌去除图片中的噪声和杂点、分割连通区域‌、减小目标物体的尺寸‌,而膨胀操作能填充图片中的小孔和断裂部分、放大特征、平滑边界,更详细的介绍可以查看参考文献或者百度相应内容。
  参考文献6中介绍了膨胀和腐蚀的C++代码实现方式,主要就是两层循环遍历图像的每个像素,再内嵌两层循环判断与核矩形的重叠位置,取其最大值或最小值作为当前像素点的值。参考文献示例中的核矩形用的3X3的矩形,中心点在矩形中心,实际opencv中支持不同只存的核矩形且能指定中心点。
  原本打算翻一下opencv源码中的膨胀和腐蚀源代码,不过就找到下图截图位置,函数嵌套使用太多了,不想往下找了。不过也能看得出来,膨胀和腐蚀本质上都是同一函数底层实现的。

  腐蚀和膨胀的OpenCvSharp函数声明如下所示,主要参数意义如下:
  1)src:源图像,可以输入Mat类型实例;
  2)dst:腐蚀或膨胀函数的处理结果,可以用Mat类型;
  3)element:核矩形,可以使用getStructuringElement函数创建,也可以使用Mat.Ones函数创建,可以是矩形,也可以是十字形、椭圆形等形状。如果该参数为空,则默认使用3X3的矩形;
  4)anchor :核矩形的中心位置,默认值为(-1, -1),也即矩形的中心;
  5)iterations:腐蚀或膨胀操作的执行次数,默认为1次。

csharp 复制代码
public static void Erode(InputArray src, OutputArray dst, InputArray? element, Point? anchor = null, int iterations = 1, BorderTypes borderType = BorderTypes.Constant, Scalar? borderValue = null)
public static void Dilate(InputArray src, OutputArray dst, InputArray? element, Point? anchor = null, int iterations = 1, BorderTypes borderType = BorderTypes.Constant, Scalar? borderValue = null)

腐蚀及膨胀的示例代码及运行效果如下所示:

csharp 复制代码
int iterations= Convert.ToInt32(textBox1.Text);
using Mat imgSrc = Cv2.ImRead(lblMsg.Text);

using Mat kernalMat = Mat.Ones(Convert.ToInt32(textBox2.Text), Convert.ToInt32(textBox2.Text),MatType.CV_8UC1);
using Mat imgDest = new Mat(imgSrc.Size(), imgSrc.Type());
Cv2.Erode(imgSrc, imgDest, kernalMat, null, iterations);

Cv2.ImShow("腐蚀操作", imgDest);
csharp 复制代码
int iterations= Convert.ToInt32(textBox1.Text);
using Mat imgSrc = Cv2.ImRead(lblMsg.Text);

using Mat kernalMat = Mat.Ones(Convert.ToInt32(textBox2.Text), Convert.ToInt32(textBox2.Text),MatType.CV_8UC1);
using Mat imgDest = new Mat(imgSrc.Size(), imgSrc.Type());
Cv2.Dilate(imgSrc, imgDest, kernalMat, null, iterations);

Cv2.ImShow("膨胀操作", imgDest);

参考文献:

[1]https://github.com/shimat/opencvsharp

[2]https://blog.csdn.net/weixin_45052363/article/details/132112794

[3]https://blog.csdn.net/m0_37605642/article/details/132352643

[4]https://opencv.org/

[5]https://github.com/opencv/opencv

[6]https://cloud.tencent.com/developer/article/1485860

[7]https://blog.csdn.net/cs1395293598/article/details/134716765

[8]https://zhuanlan.zhihu.com/p/613908156

[9]https://blog.csdn.net/weixin_46999174/article/details/140642492

相关推荐
pchmi1 天前
C# OpenCV机器视觉:振动频率测量
人工智能·opencv·计算机视觉·c#·opencvsharp
pchmi2 天前
C# OpenCV机器视觉:转速测量
c#·机器视觉·opencvsharp·转速测量
gc_22993 天前
C#调用OpenCvSharp实现图像的开运算和闭运算
opencvsharp·开运算·闭运算
pchmi1 个月前
C# OpenCV机器视觉:图像分割(让照片中的物体各自“安家”!)
opencv·c#·opencvsharp
闲人编程1 个月前
矩形增量膨胀安全走廊模型详解及python实现
开发语言·python·安全·膨胀·矩形·增量·安全走廊
runing_an_min3 个月前
ffmpeg视频滤镜:腐蚀滤镜
ffmpeg·音视频·腐蚀·erosion
gc_22996 个月前
C#调用OpenCvSharp实现图像的角点检测
opencvsharp·harris·角点检测
璞楞登斯沃8 个月前
羽隔已就之图像处理之膨胀腐蚀
图像处理·matlab·矩阵·膨胀·腐蚀
金增辉8 个月前
C#图像处理实例1:opencvsharp获取轮廓凸包
图像处理·opencv·c#·opencvsharp