5

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

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

4

2 回答 2

6

具有相同核的 Dilation 可以用两个卷积操作来表示:

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

由于卷积的特性,该操作等价于:

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

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

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

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

于 2012-08-29T06:43:32.637 回答
0

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

于 2012-08-29T06:24:15.273 回答