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

C++ 使用3x3结构元素执行两次形态扩张是否等于使用6x6结构元素执行一次形态扩张?,c++,image-processing,opencv,morphological-analysis,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); 我的问题是

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

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

您必须自己测量性能,但使用6x6元素进行一次放大应该更快,这似乎是合乎逻辑的。sais认为二进制膨胀是关联的。这意味着,如果一个3x3的矩形与另一个这样的矩形展开后得到一个6x6的矩形,那么实际上两个3x3的展开相当于一个6x6的展开。

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

("YourImage" convolve "DilationKernel") convolve "DilationKernel" 
由于卷积的性质,此运算等价于:

"YourImage" convolve ( "DilationKernel" convolve "DilationKernel")
3x3内核与自身的卷积将导致5x5矩阵,因此您的6x6假设是错误的

就绩效而言,有很多事情要考虑。在我之前的实习中,我们的目标是使用尽可能小的内核,因为较大的内核会降低性能。经验法则是,小内核对映像的作用更快,因为您可以使用CPU寄存器简单地存储和检索它们,而无需访问L1或L2缓存。此外,如果内核适合寄存器,则可以轻松使用SSE指令


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

为什么“它看起来合乎逻辑”?一个简单的实现必须为每个像素寻找6*6个邻居,或者2*3*3个像素。6*6 > 2*3*3@nikie,你说得对。尽管对于矩形结构元素,这可以通过前缀和进行优化。我不太熟悉图像形态学中使用的算法。谢谢你指出错误。我仍在寻找性能比较。我想我可能需要设计自己的方法来比较这两种操作