对于图像分割,我使用OpenCV的高斯模糊(
你能给我一些加速的建议吗?目前我正在尝试在FFT中实现高斯滤波。我已经编写了以下代码:
这里的问题在于
以下是回答: 我已经实现了近似过滤:
GaussianBlur
),使用高斯差分特征(范围从0.8到8.43,指数步长为1.4)。我的图像大小为4096 x 2160,因此这需要相当长的时间(在一个核心上需要8秒,处理视频时时间相当长)。你能给我一些加速的建议吗?目前我正在尝试在FFT中实现高斯滤波。我已经编写了以下代码:
ftimage = np.fft.fft2(image)
ftimage = np.fft.fftshift(ftimage)
kernel = cv2.getGaussianKernel(11, 3)
kernel = kernel * kernel.T
ftkernel = np.fft.fftshift(np.fft.fft2(kernel, (h, w)))
ftimagep = ftimage * gmask
imagep = np.fft.ifft2(ftimagep)
imageq = cv2.GaussianBlur(image, (11,11), 3))
这里的问题在于
imagep
和imageq
是彼此平移的版本。
其次,由于高斯函数的傅里叶变换也是高斯函数,我该如何以直接的方式计算ftkernel
?
以下是回答: 我已经实现了近似过滤:
def approx_g(image, sigma_g, n=5):
w = np.sqrt(12*sigma_g**2/n + 1)
wu = np.ceil(w) if np.ceil(w) % 2 == 1 else np.ceil(w)+1
wl = np.floor(w) if np.floor(w) % 2 == 1 else np.floor(w)-1
if w == w//1:
wl -= 2
wu += 2
m = round((12*sigma_g**2 - n*wl**2 - 4*n*wl - 3*n) / (-4*wl - 4))
wl = int(wl)
wu = int(wu)
for num in range(0,int(m)):
image = cv2.blur(image, (wl, wl))
for num in range(0,int(n-m)):
image = cv2.blur(image, (wu, wu))
return image
当n=4时,L2像素差看起来相当不错:
我还进行了不同sigma的速度比较: