为什么 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应用白色。
我正在尝试获得 模糊效果。我知道我可以通过使用 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应用白色。