opencv 用3x3结构元素执行两次形态扩张是否等于用6x6结构元素执行一次形态扩张?

afdcj2ne  于 2023-06-24  发布在  其他
关注(0)|答案(3)|浏览(97)

我的问题很简单。可能太简单了。但问题是,在我的一个项目中,我用下面几行来扩展一个二进制图像。

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 2);

其基本上是用3 × 3矩形结构元素来扩展二进制图像。从最后一个参数可以看到,我正在执行这个操作的2次迭代,这相当于:

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1);
cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1);

我的问题是:如果我使用6x6结构元素只执行一次迭代,而不是执行两次迭代,这在准确性和性能方面是否等同于上面的代码?图像只迭代一次,是否更快?

weylhg0b

weylhg0b1#

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

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

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

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

一个3x3内核与它自身的卷积将产生5x5矩阵,所以你的6x6假设是错误的。
在性能方面,有很多需要考虑的。在我之前的实习中,我们的目标是使用尽可能小的内核,因为较大的内核会导致性能损失。经验法则是,小内核对映像的处理速度更快,因为您可以使用CPU寄存器存储和检索它们,而无需访问L1或L2缓存。而且如果你的内核适合寄存器,你可以很容易地使用SSE指令。
卷积的并行化是另一回事,我没有太多关于它的实用信息。所以我不知道如果使用并行实现,这个经验事实是否仍然成立。

csbfibhn

csbfibhn2#

你将不得不自己测量性能,但是用6x6元素进行一次膨胀应该更快,这似乎是合乎逻辑的。Wikipedia表示二进制膨胀是关联的。这意味着如果用另一个这样的矩形扩张的3x3矩形给出6x6矩形,则实际上两个3x3的扩张等同于一个6x6的扩张。

jckbn6z7

jckbn6z73#

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

相关问题