0

我是图像处理的新手,如果您觉得问题太简单,请原谅我。

我试图ndimage.convolve()cv2.filter2D()卷积函数替换。

这是原始代码

ndimage.convolve(Gxx,f,origin=0)

这是替换功能

cv2.filter2D(Gxx,-1,cv2.flip(f,-1),borderType=cv2.BORDER_REFLECT,anchor=(-1,-1))

两个代码都返回不同的值,我尝试使用参数 atndimage.convolve并将原点设置为 -1 然后它返回确切的结果,cv2.filter2D但这不是我想要的,因为我希望 ndimage.convolve 使用默认原点这是零。

在我再次研究 opencv 文档后,filter2D我意识到

过滤函数实际上计算相关性。如果你有一个对称的卷积核,那么相关性和卷积的数学表达式是相同的。

如果内核不对称,则必须翻转内核并将锚点设置为(kernel.cols - anchor.x - 1,kernel.rows - anchor.y - 1)。这将计算实际的卷积。

所以我cv2.flip(f,-1)双向翻转内核,但我不知道翻转内核后如何计算新的锚点,根据文档,我需要将锚点设置为(kernel.cols - anchor.x - 1, kernel.rows - anchor.y - 1). 我猜kernel.cols 和kernel.rows是两个方向的内核大小,但这里的含义anchor.xanchor.y含义是什么?它是内核的原始锚点吗?假设内核是 42 X 42,那么新的锚点是什么?提前致谢。

4

1 回答 1

0

过滤器的锚点通常位于其中心。因此,对于 3x3 过滤器,从零开始索引时为 (1, 1)。例如,一个简单的边缘过滤器:

1 0 -1
1 0 -1
1 0 -1

锚点位于中心 (1, 1) 是有道理的,因为当卷积应用于图像中的特定点时,它会计算其直接邻域中左右点之间的差异。

现在让我们看看你的 42x42 内核。对于 41x41,中心是 (20, 20),对于 43x43,中心是 (21, 21)。

内核 42x42 具有均匀的边长,使其不对称。这就是为什么首选边长奇数的内核的原因之一。

对于这样的过滤器内核,锚点从中心移动到下一个有效坐标。例如,一个 4x4 内核的中心位于 (1.5, 1.5) 并相应地锚定在 (2, 2)。

因此,在您使用 42x42 内核的情况下,锚点将从中心 (20.5, 20.5) 移动到 (21, 21)。如果你翻转内核,锚点也需要翻转:在 (20.5, 20.5) 到 (20, 20) 的中心点对称。这也是给定公式 kernel.cols - anchor.x - 1 的结果:

42 - 21 - 1 = 20

于 2022-02-26T23:28:59.400 回答