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

时间:2012-08-29 06:08:38

标签: c++ image-processing opencv morphological-analysis

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

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结构元素执行一次迭代,而不是执行两次迭代,这在准确性和性能方面是否等同于上面的代码?因为图像只迭代一次,它会更快吗?

2 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

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

答案 1 :(得分:0)

您必须自己测量性能,但使用6x6元素的扩张应该更快似乎合乎逻辑。 Wikipedia sais表示二元扩张是关联的。这意味着如果用另一个这样的矩形扩张的3x3矩形给出6x6矩形,那么实际上两次3x3的扩张相当于一次扩张6x6。