我希望平滑二值化图像的轮廓,并认为侵蚀是最好的方法。我知道正常的工作方式是使用cvDilate(src,dst,0,iter);其中0是3x3矩阵。
问题是3x3矩阵在我的图像中深深腐蚀。如何使用2x2矩阵或任何小于默认3x3矩阵的内容进行侵蚀。
答案 0 :(得分:22)
答案 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)
这是一种快速而肮脏的方法,可以告诉您扩张/侵蚀是否适合您:
答案 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()函数