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

mas*_*sad 5 c++ opencv image-processing morphological-analysis

我的问题很简单.这可能太简单了.但事情是在我的一个项目上工作时,我使用以下几行来扩展二进制图像.

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 2);
Run Code Online (Sandbox Code Playgroud)

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

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1);
cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1);
Run Code Online (Sandbox Code Playgroud)

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

Seç*_*şçı 6

使用相同内核的扩张可以用两个卷积运算表示:

("YourImage" convolve "DilationKernel") convolve "DilationKernel" 
Run Code Online (Sandbox Code Playgroud)

由于卷积的特性,此操作适用于:

"YourImage" convolve ( "DilationKernel" convolve "DilationKernel")
Run Code Online (Sandbox Code Playgroud)

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

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

卷积的并行化是另一个故事,我没有太多关于它的实用信息.因此,如果使用并行化实现,我不知道这些经验事实仍然存在.