【问题标题】:Linear Inverted Image on OpencvOpencv上的线性反转图像
【发布时间】:2019-01-25 06:44:21
【问题描述】:

我正在尝试使用 opencv 和 python 在 GIMP 中模拟线性反转函数。除了在线性光下使用之外,我找不到有关如何实现该功能的更多信息。自从我读到 opencv 导入线性 BGR 图像后,我开始尝试在 RGB opencv 上进行正常反转,但我只能复制常见的GIMP 上的反演方法。

反演函数:

def negative(image):
    img_negative = (255-image)
    return img_negative

原创

GIMP 上的线性反转(负)图像

GIMP 上的倒置(负片)图像

任何见解将不胜感激。

【问题讨论】:

  • 了解您在 OpenCV 中实际如何处理倒置图像很有用?
  • 我现在刚刚包含了这个函数
  • 您可以转换为线性RGB,使用相同的公式进行反转,然后使用此处的公式entropymine.com/imageworsener/srgbformula 转换回sRGB

标签: python opencv image-processing colors gimp


【解决方案1】:

从 2.10 开始,Gimp 在线性色彩空间中工作,如果您查看该函数的原始源代码,它只是按位计算的。所以,下面是代码在 opencv-python 中的样子:

import numpy as np
import cv2

#https://www.pyimagesearch.com/2015/10/05/opencv-gamma-correction/

def adjust_gamma(image, gamma=1.0):
    # build a lookup table mapping the pixel values [0, 255] to
    # their adjusted gamma values
    invGamma = 1.0 / gamma
    table = np.array([((i / 255.0) ** invGamma) * 255
        for i in np.arange(0, 256)]).astype("uint8")

    # apply gamma correction using the lookup table
    return cv2.LUT(image, table)

def invert_linear(img):
    x= adjust_gamma(img, 1/2.2)
    x= cv2.bitwise_not(x)
    y=  adjust_gamma(x, 2.2)

    return y



【讨论】:

    【解决方案2】:

    这需要一点点试错,但除了反转图像之外,还必须进行一些缩放和平移。

    我所做的特别是除了反转图像之外,我还截断了每个通道的强度超过 153 的任何值,并将它们饱和到 153。使用此中间输出后,我移动范围以便映射最低值到 102,最高值被映射到 255。这只需将 102 添加到中间输出中的每个值即可。

    当我这样做时,我得到了一张与你所追求的相似的图像。

    换句话说:

    import cv2
    import numpy as np
    
    im = cv2.imread('input.png') # Your image goes here
    im_neg = 255 - im
    im_neg[im_neg >= 153] = 153 # Step #1
    im_neg = im_neg + 102 # Step #2
    cv2.imshow('Output', np.hstack((im, im_neg)))
    cv2.waitKey(0)
    cv2.destroyWindow('Output')
    

    值得庆幸的是,最小值和最大值分别为 0 和 255,这使得这个过程更简单。我得到这个输出并注意到我将两个图像连接在一起:

    请注意,您想要的图像存储在im_neg 中。如果您只想单独查看图像:

    与你的相比:

    这与您在提供的输出图像中看到的不完全一样,特别是因为彩色方块周围似乎有一些噪点,但这是我能得到的最接近的结果,有人可能会争辩说我产生的结果更好感性的。

    希望这会有所帮助!

    【讨论】:

    • 非常感谢!我个人找不到两个倒置图像之间的关系。我最接近的是通过图像曝光,但我无法让它看起来如此相似。再次感谢。
    • 不客气。我突然想到使用了某种线性变换,因为当您反转图像时,白色区域应该是黑色的,但在 GIMP 输出图像中它们是灰色的。我认为必须进行一些偏移和缩放才能获得该结果。
    • 那个灰度值是什么意思呢?为什么白色映射到中间灰度值而不是黑色?这在感知上是否有帮助,还是有其他原因?
    • @CrisLuengo 我所做的值的截断将任何大于 153 的值压缩为 153。之后,我将所有内容移动 102,这意味着倒置图像中的任何黑色像素(0, 0, 0) 转换为 (102, 102, 102)。在反转输出中看到灰色使我得出结论,RGB 值的动态范围被截断和移位。
    • @CrisLuengo 老实说我不知道​​。我想他们这样做是为了让暗值更亮一点,这样你就可以看到一切,但老实说,我不确定他们这样做的理由以及为什么没有关于该过程的适当文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多