我需要使用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图像不同。
那我错过了什么?提前谢谢。
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)
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。现在它更像是我想要的但仍然存在差异。
最后编辑。在使用GaussianBlur内核大小后,我终于得到了我想要的ksize = 51
。非常感谢所有的帮助!现在我感觉有点傻了:P
答案 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)
答案 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)