【发布时间】:2017-03-02 16:13:01
【问题描述】:
对于图像分割,我使用 OpenCV 的 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的速度比较:
【问题讨论】:
-
为什么不能在较小的图像尺寸上运行分割?
-
我不确定 OpenCV 中 GaussianBlur 的特定实现,但是 filter2D()(可以很容易地用于实现相同的效果)已经使用基于 DFT 的算法来处理大于 ~11x11 像素的内核.考虑一下:docs.opencv.org/3.0-beta/modules/imgproc/doc/…
标签: python opencv image-processing