为什么 cv2.filter2D() 没有按预期工作?

Why isn't cv2.filter2D() working as expected?

我正在尝试获得 模糊效果。我知道我可以通过使用 cv2.blur() 来做到这一点,但是当我使用 cv2.filter2D() 时,它似乎并没有干得真好。

import cv2
import numpy as np

img = cv2.imread("img.jpeg")

bimg = cv2.blur(img, (5, 5))

k3 = np.ones((5, 5), np.float32)
kimg = cv2.filter2D(img, -1, k3)

cv2.imshow("O", img)
cv2.imshow("B", bimg)
cv2.imshow("K", kimg)

cv2.waitKey(0)
cv2.destroyAllWindows()

Output

谢谢。

我们不想改变图像的平均值,所以需要保证核的和为1

代替k3 = np.ones((5, 5), np.float32),使用:

k3 = np.ones((5, 5), np.float32) / 25

为什么使用 ones(5, 5) 内核会产生白色图像?

例如假设img的所有像素值都等于100.

应用cv2.filter2D(离散二维卷积)对于每个像素:

kimg[y,x] = img[y-2, x-2]*1 + img[y-2, x-1]*1 + img[y-2, x]*1 + ... + img[y+2, x+2]
= 100*1 + 100*1 + ... + 100*1 = 100*25 = 2500.

kimg的所有像素点的值将是2500)。

由于kimg的类型是uint8,所有高于255的值都被裁剪为255,所以2500被裁剪为255,255应用白色。