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次。
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)
腐蚀及膨胀的示例代码及运行效果如下所示:
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);
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