簡體   English   中英

cv2.GaussianBlur和cv2.filter2D與高斯內核的結果不同?

[英]Different results with cv2.GaussianBlur and cv2.filter2D with a gaussian kernel?

我正在嘗試在Python中移植一些lua / torch代碼,有一個序列對圖像運行高斯模糊,如下所示:

local gauK = image.gaussian(math.ceil(3*sigma)*2+1, sigma)
inp = image.convolve(inp, gauK, 'same')

為了用我的方法復制這一點,我一直在研究cv2.GaussianBlur()和cv2.filter2D並傳入一個高斯內核。

方法1(cv2.GaussianBlur):

kernel_size = int(math.ceil(3 * sigma) * 2 + 1)  # same size as the lua code
blurred_image = cv2.GaussianBlur(img, ksize=(kernel_size, kernel_size), sigma)

方法2(cv2.filter2D)

kernel_size = int(math.ceil(3 * sigma) * 2 + 1)  # same size as the lua code
gaussian_kernel = cv2.getGaussianKernel(kernel_size, sigma)
blurred_image_2 = cv2.filter2D(img, -1, gaussian_kernel)

在方法1和方法2之間,我得到了不同的圖像。 看來方法1的圖像比方法2的圖像更模糊。是否有任何理由為什么我在這里可能會得到不同的結果? 我試圖找出哪一個將匹配lua代碼。 謝謝。

這是一個怪異的東西。 出於實用性考慮,我建議您選擇一個滿意的東西並使用它。 除此之外,我猜想如何處理多個參數的語義會導致這種不匹配。 而且,opencv的用於從kernelsize推斷sigma(反之亦然)的等式似乎與您的不匹配。

來自GaussianBlur docs

  • ksize:高斯核大小。 ksize.width和ksize.height可以不同,但​​它們都必須為正數和奇數。 或者,它們可以為零,然后根據sigma計算得出。
  • sigmaX:X方向上的高斯核標准偏差。
  • sigmaY:Y方向上的高斯核標准差; 如果sigmaY為零,則將其設置為等於sigmaX;如果兩個sigmas為零,則分別從ksize.width和ksize.height計算得出(有關詳細信息,請參見cv :: getGaussianKernel); 為了完全控制結果,而不管將來可能對所有這些語義進行的修改,建議指定所有ksize,sigmaX和sigmaY。

getGaussianKernel docs

  • 如果它為非正值 ,則根據kigma為sigma = 0.3\\*((ksize-1)\\*0.5 - 1) + 0.8

全部強調我的。 您的sigma是否為負? 這可能會導致不匹配。

編輯:只是注意到您希望它匹配lua代碼。 我的建議是保存結果,然后在photoshop或您喜歡的圖像編輯器中比較它們。 如果從參考中減去測試,您應該能夠看到差異,並且隨着嘗試的臨近,總體上差異也應該更少。 除非如此,否則您可以嘗試閱讀源代碼以找出定義上的差異,或者自己編寫!

祝好運!

cv2.getGaussianKernel函數返回1D向量,使其成為2D高斯矩陣,可以將其與其轉置相乘(@用於矩陣乘法)。 您可以嘗試以下代碼:

gaussian_kernel = cv2.getGaussianKernel(kernel_size, sigma)
kernel_2D = gaussian_kernel @ gaussian_kernel.transpose()
blurred_image_2 = cv2.filter2D(img, -1, kernel_2D)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM