在OpenCV中实现Photoshop高通滤波器(HPF)

12
我需要使用OpenCV实现Photoshop中的高通滤波器。我已经阅读了关于OpenCV中高通滤波器的内容并尝试了一些卷积核,例如{{kernel}}。
[[ 0, -1, 0], 
 [-1, 4, -1],
 [ 0, -1, 0]].

然而,我的结果并不是我想要的,因为输出图像大部分是黑白的,而在Photoshop中输出的图像是灰色的。以下是示例:OpenCV高通滤波Photoshop高通滤波。此外,我尝试了以下方法:

blur = cv2.GaussianBlur(img,(ksize,ksize),0)
filtered = cv2.subtract(img,blur)

结果类似于OpenCV高通滤波

之后,我尝试给输出图像的每个像素添加127。确实,图片现在看起来有点灰色, 但是仍然与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)

这里是结果原始图片

编辑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)

输出结果是这个。现在更接近我想要的,但仍有差异。
我的代码: my output Photoshop: photoshop output 最后编辑。在调整高斯模糊核大小后,我终于用ksize = 51得到了我想要的结果。非常感谢所有的帮助!现在我感觉有点傻 :P

2
你能添加高通滤波的Python代码吗?我猜测负值被截断为0。当你加上127时,那将是输出的最小值。Photoshop版本的输出比127中位数更暗。 - Håken Lid
你的代码输出和 Photoshop 得到的结果非常相似。我认为你可以通过进一步调整核心来更加接近。Photoshop 可能使用 5x5 的核心。或者,你可以尝试将 0 值改为 1,4 值改为 8(整个核心的总和应该为 0)。 - Håken Lid
除了进一步调整内核大小外,您还可以像这样乘以差的输出:constant * (img -blur) +127。 您需要不断调整直到达到正确的效果。 - Cris Luengo
5
дҪ зҡ„д»Јз Ғдёӯзҡ„neg_frameжҳҜд»Җд№Ҳпјҹ - Vasyl Vaskivskyi
3
请在回答中描述您的解决方案,以帮助其他人。 - Pibben
请更新答案,包含用于获取结果的所有代码。我们不知道neg_frame是什么,也不知道它的形状是什么。 - WASasquatch
3个回答

3

更Pythonic,更简洁的方式,避免不必要的导入和变量。

import cv2


def highpass(img, sigma):
    return img - cv2.GaussianBlur(img, (0,0), sigma) + 127

img = cv2.imread('lena.png')
img = highpass(img, 3)

cv2.imshow('lena highpass', img)
cv2.waitKey(0)

enter image description here


尽管我很喜欢看到Lenna,但我认为她不适合出现在这样的公共论坛上。特别是你使用了比经典版更加大胆的版本。 - Mark Ransom
搜索引擎对公众开放,我从那里找到了Lena的未剪辑版本。 http://www.lenna.org/ - zoltron
搜索引擎是为那些知道自己正在寻找什么的人准备的。没有人会来StackOverflow寻找裸体照片,也许有50%的人会因意外遭遇而感到不悦。我敦促您考虑到您的整个观众群体。P.S.版权法律可能会禁止您发布这张图片,无论您在哪里找到它。 - Mark Ransom
我用更好的答案替换了它。我改变了图片。 - zoltron

3

如果您在黑色背景上拍摄一张只有一个白色像素的图像,并在 Photoshop 中应用滤镜,您将从 Photoshop 得到卷积核。


2
没错,但是这里有个技巧 - 不要使用白色和黑色,使用浅灰色和深灰色。比如说 192 和 64。这样你在截取之前就可以知道核心值是什么了。 - Mark Ransom

1
当你在减去模糊图像时,需要使用浮点数而不是整数来进行计算,然后再加上127,否则会截断负像素。我还在核心位中添加了一个奇数检查器,现在它的表现就像 Photoshop 一样。
import cv2
import numpy
img = cv2.imread('images/test.jpg')
size =50
if not size%2:
    size +=1
kernel = numpy.ones((size,size),numpy.float32)/(size*size)
filtered= cv2.filter2D(img,-1,kernel)
filtered = img.astype('float32') - filtered.astype('float32')
filtered = filtered + 127*numpy.ones(img.shape, numpy.uint8)
cv2.imwrite('output.jpg', filtered)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接