【问题标题】:Implementing Photoshop High Pass Filter (HPF) in OpenCV在 OpenCV 中实现 Photoshop 高通滤波器 (HPF)
【发布时间】:2018-11-03 15:05:13
【问题描述】:

我需要使用 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 图像不同。

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

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

这里是resultoriginal 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


【解决方案1】:

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

【讨论】:

  • 尽管我很喜欢见到 Lenna,但我认为她在这样的公共论坛中没有一席之地。尤其是因为您使用的版本比经典版本更危险。
  • 搜索引擎对公众开放,我从那里找到了未删减版的莉娜。 lenna.org
  • 搜索引擎适用于知道自己在寻找什么的人。没有人会来 StackOverflow 寻找裸体女性的照片,而且可能有 50% 的人会因为意外遇到它而退缩。我敦促您考虑您的整个观众。附:版权法可能禁止您发布图片,无论您在哪里找到它。
  • 我用更好的答案代替了它。我改变了图像。
【解决方案2】:

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

【讨论】:

  • 这是真的,但这里有个技巧——不要使用白色和黑色,使用浅灰色和深灰色。说 192 和 64。然后你就会知道裁剪前的内核值是多少。
【解决方案3】:

当您减去模糊图像时,您需要在添加 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)

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 2019-12-08
    • 2018-01-26
    • 2021-07-20
    • 2012-09-21
    • 1970-01-01
    • 2012-12-02
    • 2017-05-09
    • 2012-07-14
    相关资源
    最近更新 更多