用3x3结构元素进行两次形态扩张,等于用6x6结构元素进行一次形态扩张

Is performing two morphological Dilation with 3x3 structuring element equal to one with 6x6 structuring element?

本文关键字:结构 元素 于用 一次 6x6 两次 3x3      更新时间:2023-10-16

我的问题很简单。这可能太简单了。但问题是,在我的一个项目中,我使用了以下几行来放大二进制图像。

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结构化元素只执行一次迭代,而不是执行两次迭代,那么在准确性和性能方面,这与上述代码等效吗?图像只迭代一次,速度会更快吗?

具有相同内核的展开可以用两个卷积运算来表示:

("YourImage" convolve "DilationKernel") convolve "DilationKernel" 

由于卷积的性质,这个运算等价于:

"YourImage" convolve ( "DilationKernel" convolve "DilationKernel")

3x3内核与自身的卷积将产生5x5矩阵,因此您的6x6假设是错误的。

就性能而言,需要考虑的因素太多了。在我之前的实习中,我们的目标是使用尽可能小的内核,因为较大的内核会导致性能损失。经验法则是,小内核对图像的作用更快,因为只需使用CPU寄存器即可存储和检索它们,而无需访问L1或L2缓存。此外,如果您的内核适合寄存器,您可以轻松地使用SSE指令。

卷积的并行化是另一回事,我没有太多关于它的实际信息。所以我不知道如果使用并行化实现,这些经验事实仍然成立。

您必须自己测量性能,但使用6x6元素进行一次膨胀应该更快,这似乎是合乎逻辑的。维基百科说二元膨胀是关联的。这意味着,如果用另一个这样的矩形扩张3x3的矩形得到6x6的矩形,那么实际上两次3x3的扩张相当于一次6x6的扩张。

首先,squential中的两个3x3应该与一个5x5相同。第二,性能方面,5x5较慢。有一些粗略的想法:如果你考虑原始实现(基于循环),计算的数量应该是3x3xWxHx2,而不是5x5xWxHx1。