扩张/侵蚀修改内核选项

时间:2011-03-01 12:07:09

标签: image-processing opencv computer-vision

我希望平滑二值化图像的轮廓,并认为侵蚀是最好的方法。我知道正常的工作方式是使用cvDilate(src,dst,0,iter);其中0是3x3矩阵。

问题是3x3矩阵在我的图像中深深腐蚀。如何使用2x2矩阵或任何小于默认3x3矩阵的内容进行侵蚀。

6 个答案:

答案 0 :(得分:22)

在这里您可以参考使用不同内核的结果:

enter image description here

Saludos!

答案 1 :(得分:4)

如果您的目标是使用具有平滑边缘的二值化图像,那么,如果您有原始图像,最好在执行二值化之前使用类似cvSmooth()的高斯模糊效果。

那就是说,你不仅限于3x3内核。 cvDilate()获取IplConvKernel生成的CreateStructuringElementEx,您可以使用该函数制作任何(矩形)形状的结构元素。 但是,结构元素相对于必须具有整数坐标的锚点起作用,因此如果使用2x2矩阵,则矩阵不能以像素为中心。所以在大多数情况下,最好使用具有奇数行和列的结构元素。

你可以做的是创建一个3x3结构元素,其中只有中心值和正好在其上方,下方,左侧和右侧的值为1,如下所示:

0 1 0
1 1 1
0 1 0

而不是默认值:

1 1 1
1 1 1
1 1 1

第一个内核会产生一些稍微平滑的边缘。

答案 2 :(得分:3)

这是一种快速而肮脏的方法,可以告诉您扩张/侵蚀是否适合您:

  • 取样您的图片。
  • 使用您可以使用的最小过滤器(通常为3x3)侵蚀(扩张,打开,关闭等)
  • 缩小回原始图像尺寸

答案 3 :(得分:1)

使用C API,您可以使用函数IplConvKernel创建任何类型和大小的专用CreateStructuringElementEx()对象。如果要使用C ++ API(函数dilate()),则用于扩张的结构元素是您想要的任何矩阵(Mat)。

答案 4 :(得分:1)

全1的内核是低通卷积滤波器。扩张滤波器用3x3区域中最暗的像素替换3X3区域中的每个像素。侵蚀滤波器用3x3区域中最亮的像素替换3X3区域中的每个像素。也就是说,如果你的背景很亮,前景物体很暗。如果你翻转你的背景和前景,那么你也会翻转你的扩张和侵蚀过滤器。

此外,如果您想执行“打开”操作,则会执行侵蚀,然后进行扩张。相反,“近距离”操作是扩张,然后是侵蚀。开放趋向于去除孤立的像素块,并且接近倾向于填充孔。

答案 5 :(得分:0)

腐蚀和膨胀矩阵应该是奇数顺序

- 无法使用2 * 2矩阵

卷积矩阵的顺序应为1 * 1 3 * 3 5 * 5 7 * 7 ......但ODD

尝试应用close - Erode然后扩展图像操作 - 使用cvMorpologyEx()函数