Opencv上的线性反转图像

时间:2018-08-18 12:29:46

标签: python opencv image-processing colors gimp

我正在尝试使用opencv和python模拟GIMP中的线性反转函数。除了在线性光线下使用该功能外,我没有找到有关该功能如何实现的更多信息。由于我读到opencv会导入线性BGR图像,因此我尝试在RGB opencv上进行正态反转,但我只能复制通用GIMP的反演方法。

反函数:

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

原始

Original

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

What I want

GIMP上的反转(负)图像

What I'm getting in opencv

任何见识都会受到赞赏。

2 个答案:

答案 0 :(得分:3)

这花费了一些尝试和错误,但是除了反转图像外,还必须进行一些缩放和转换。

我专门做的是除了反转图像之外,我还截断了每个通道强度超过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,这使此过程更加简单。我得到此输出,并注意我将两个图像连接在一起:

enter image description here

请注意,所需的图像存储在im_neg中。如果您只想看图像本身:

enter image description here

与您的相比:

这与您提供的输出图像中所看到的并不完全相同,特别是因为在彩色正方形周围似乎存在一些噪点,但这是我能得到的最接近的噪声,而且有人可能会说我产生的结果更好感性地。

希望这会有所帮助!

答案 1 :(得分:0)

从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