卷积:2d vs 1d 2pass给出不同的结果

2024-04-26 03:41:28 发布

您现在位置:Python中文网/ 问答频道 /正文

理论上,二维卷积可以拆分为:G(x,y)*I = G(x) * G(y)*I

但当我尝试这个:

import cv2
import scipy.signal as signal
import numpy as np

image = np.random.randint(255, size=(5, 5))
kernel = cv2.getGaussianKernel(13, 2)
kernel_2D = np.outer(kernel, kernel)

result1 = signal.convolve(image, kernel_2D, mode='same')
result2 = signal.convolve(signal.convolve(image, kernel, mode='same'), kernel, mode='same')

result3 = cv2.filter2D(image,-1, kernel_2D, borderType=0)
result4 = cv2.sepFilter2D(image*1.0, -1, kernel, kernel, borderType=0)

在这里,我们观察到结果3和4是相同的(注:如果内核是对称的,opencv filter2D函数计算的相关性等于卷积,否则您必须翻转内核和锚定点),但问题是:

为什么result1=result2?结果2是错误的(i)


Tags: imageimportsignalmodeasnpcv2kernel
1条回答
网友
1楼 · 发布于 2024-04-26 03:41:28

问题是在同一方向卷积两次,而不是沿着每个图像轴卷积一次:

result2 = signal.convolve(signal.convolve(image, kernel, mode='same'), kernel.T, mode='same')
#                                                                      ^^^^^^^^

这给了我一个平均绝对差(每像素)result1,顺序是1e-15。在

相关问题 更多 >