【发布时间】:2018-11-03 15:05:13
【问题描述】:
我需要使用 OpenCV 从 Photoshop 实现高通滤波器。我读过 OpenCV 中的高通滤波器并尝试了一些内核,比如
[[ 0, -1, 0],
[-1, 4, -1],
[ 0, -1, 0]].
但是,结果不是我想要的,因为输出图像大部分是黑白的,而 Photoshop 中的输出图像是灰色的。 以下是示例: OpenCV high pass 和 Photoshop high pass。 另外,我试过了:
blur = cv2.GaussianBlur(img,(ksize,ksize),0)
filtered = cv2.subtract(img,blur)
结果类似于OpenCV high pass。
之后,我尝试将 127 添加到输出图像的每个像素。确实,the image look gray-ish now,但它仍然与 Photoshop 图像不同。
那么我错过了什么?提前致谢。
编辑。致 Håken Lid:现在的代码是这样的:
import cv2
import numpy
img = cv2.imread('input.jpg')
blur = cv2.GaussianBlur(img,(31,31),0)
filtered = cv2.subtract(img, blur)
filtered = cv2.add(filtered, 127*numpy.ones(neg_frame.shape, numpy.uint8))
cv2.imwrite('output.jpg', filtered)
这里是result 和original picture。
编辑2。是的,Håken Lid 关于截断是对的。我再次编辑了代码:
import cv2
import numpy
img = cv2.imread('input.jpg')
blur = cv2.GaussianBlur(img,(31,31),0)
filtered = img - blur
filtered = filtered + 127*numpy.ones(neg_frame.shape, numpy.uint8)
cv2.imwrite('output.jpg', filtered)
输出结果为this。现在它更像我想要的,但差异仍然存在。
最后一次编辑。在玩过 GaussianBlur 内核大小之后,我终于得到了我想要的 ksize = 51。非常感谢所有的帮助!现在我感觉有点笨:P
【问题讨论】:
-
你可以为高通添加你的python代码吗?我的猜测是负值被截断为 0。当您添加 127 时,这将是输出的最小值。 Photoshop 版本的输出比 127 中值暗。
-
您的代码和 photoshop 的输出非常相似。我认为你可以通过进一步调整内核来更接近。 Photoshop 可能使用 5x5 内核。或者您可以尝试将 0 值更改为 1,将 4 更改为 8(整个内核的总和应该为 0)。
-
除了进一步调整内核大小之外,您还可以像这样乘以差异的输出:
constant * (img -blur) +127。您必须进行调整,直到正确为止。 -
您的代码中的
neg_frame是什么? -
请在答案中描述您的解决方案,以帮助他人。
标签: python opencv image-processing computer-vision