我正在尝试使用opencv和python模拟GIMP中的线性反转函数。除了在线性光线下使用该功能外,我没有找到有关该功能如何实现的更多信息。由于我读到opencv会导入线性BGR图像,因此我尝试在RGB opencv上进行正态反转,但我只能复制通用GIMP的反演方法。
反函数:
def negative(image):
img_negative = (255-image)
return img_negative
任何见识都会受到赞赏。
答案 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,这使此过程更加简单。我得到此输出,并注意我将两个图像连接在一起:
请注意,所需的图像存储在im_neg
中。如果您只想看图像本身:
与您的相比:
这与您提供的输出图像中所看到的并不完全相同,特别是因为在彩色正方形周围似乎存在一些噪点,但这是我能得到的最接近的噪声,而且有人可能会说我产生的结果更好感性地。
希望这会有所帮助!
答案 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