使用 3x3 结构元素执行两次形态膨胀是不是等于使用 6x6 结构元素执行两次形态膨胀?
Posted
技术标签:
【中文标题】使用 3x3 结构元素执行两次形态膨胀是不是等于使用 6x6 结构元素执行两次形态膨胀?【英文标题】:Is performing two morphological Dilation with 3x3 structuring element equal to one with 6x6 structuring element?使用 3x3 结构元素执行两次形态膨胀是否等于使用 6x6 结构元素执行两次形态膨胀? 【发布时间】:2012-08-29 06:08:37 【问题描述】:我的问题很简单。可能太简单了。但问题是在处理我的一个项目时,我使用以下几行来扩大二进制图像。
cv::dilate(c_Proj, c_Proj, Mat(), Point(), 2);
这基本上是使用 3x3 矩形结构元素来扩展二值图像。从最后一个参数你可以看到我正在执行这个操作的 2 次迭代,相当于:
cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1);
cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1);
我的问题是: 如果我只使用 6x6 结构元素执行一次迭代,而不是执行两次迭代,这在准确性和性能方面是否等同于上述代码?图像只迭代一次会更快吗?
【问题讨论】:
【参考方案1】:同一个核的膨胀可以用两个卷积操作来表示:
("YourImage" convolve "DilationKernel") convolve "DilationKernel"
由于卷积的特性,这个操作等价于:
"YourImage" convolve ( "DilationKernel" convolve "DilationKernel")
3x3 内核与其自身的卷积将产生 5x5 矩阵,因此您的 6x6 假设是错误的。
在性能方面,需要考虑的因素很多。在我之前的实习中,我们的目标是使用尽可能小的内核,因为较大的内核会造成性能损失。经验法则是小内核对图像的反应更快,因为您可以使用 CPU 寄存器存储和检索它们,而无需访问 L1 或 L2 缓存。此外,如果您的内核适合寄存器,您可以轻松使用 SSE 指令。
卷积的并行化是另一回事,我没有太多关于它的实用信息。所以我不知道如果使用并行实现,这个经验事实仍然成立。
【讨论】:
感谢您指出错误。我仍在寻找性能比较。我想我可能必须设计自己的方法来比较这两种操作【参考方案2】:您必须自己衡量性能,但使用 6x6 元素进行一次扩张应该更快似乎是合乎逻辑的。 Wikipedia 说二元膨胀是关联的。这意味着,如果一个 3x3 的矩形与另一个这样的矩形扩张得到一个 6x6 的矩形,那么实际上两个 3x3 的扩张相当于一个 6x6 的扩张。
【讨论】:
为什么“看起来合乎逻辑”?一个简单的实现必须为每个像素查看 6*6 个邻居,或 2*3*3 个像素。 6*6 > 2*3*3 @nikie,你是对的。虽然对于矩形结构元素,这可以通过前缀和进行优化。我对图像形态学中使用的算法不是很熟悉。以上是关于使用 3x3 结构元素执行两次形态膨胀是不是等于使用 6x6 结构元素执行两次形态膨胀?的主要内容,如果未能解决你的问题,请参考以下文章