在OpenCV中实现Photoshop高通滤波器

时间:2018-05-24 11:39:15

标签: python opencv computer-vision

我需要使用OpenCV从Photoshop实现高通滤镜。我已经阅读过OpenCV中的高通滤波器,并尝试了一些内核,比如

[[ 0, -1, 0], 
 [-1, 4, -1],
 [ 0, -1, 0]].

然而,结果不是我想要的,因为输出图像大部分是黑白的,而Photoshop中的输出图像是灰色的。 这是一个例子: OpenCV high passPhotoshop 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图像不同。

那我错过了什么?提前谢谢。

EDIT。致HåkenLid:现在的代码就是这样:

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)

此处为resultoriginal picture

EDIT2。是的,HåkenLid是关于截断的。我再次编辑了代码:

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。现在它更像是我想要的但仍然存在差异。

我的代码: my output Photoshop中: photoshop output

最后编辑。在使用GaussianBlur内核大小后,我终于得到了我想要的ksize = 51。非常感谢所有的帮助!现在我感觉有点傻了:P

3 个答案:

答案 0 :(得分:2)

没有不必要的导入和变量。更多 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

答案 1 :(得分:1)

如果您在黑色背景上拍摄具有单个白色像素的图像并在Photoshop中应用滤镜,则会从Photoshop中获得卷积核。

答案 2 :(得分: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)