Opencv 上的线性倒置图像
Linear Inverted Image on Opencv
我正在尝试使用 opencv 和 python 在 GIMP 中模拟线性反转函数。除了在线性 light.Since 下使用之外,我找不到有关如何实现该功能的更多信息我读到 opencv 导入线性 BGR 图像,我继续尝试在 RGB opencv 上进行正常反转,但我只能复制GIMP上常见的反演方法。
反转函数:
def negative(image):
img_negative = (255-image)
return img_negative
原创
GIMP 上的线性倒置(负)图像
GIMP 上的反转(负)图像
如有任何见解,我们将不胜感激。
这需要一些反复试验,但除了反转图像之外,您还必须进行一些缩放和平移。
我具体做的是除了反转图像之外,我截断了每个通道强度超过 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
中。如果您只想看图片本身:
与你的相比:
这与您在提供的输出图像中看到的不完全一样,特别是因为彩色方块周围似乎有一些噪音,但这是我能得到的最接近的结果,有人可能会争辩说我产生的结果感觉上更好。
希望对您有所帮助!
从 2.10 开始,Gimp 以线性颜色工作 space,如果您查看该函数的原始源代码,它只是按位不是。所以,这是代码在 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
我正在尝试使用 opencv 和 python 在 GIMP 中模拟线性反转函数。除了在线性 light.Since 下使用之外,我找不到有关如何实现该功能的更多信息我读到 opencv 导入线性 BGR 图像,我继续尝试在 RGB opencv 上进行正常反转,但我只能复制GIMP上常见的反演方法。
反转函数:
def negative(image):
img_negative = (255-image)
return img_negative
原创
GIMP 上的线性倒置(负)图像
GIMP 上的反转(负)图像
如有任何见解,我们将不胜感激。
这需要一些反复试验,但除了反转图像之外,您还必须进行一些缩放和平移。
我具体做的是除了反转图像之外,我截断了每个通道强度超过 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
中。如果您只想看图片本身:
与你的相比:
这与您在提供的输出图像中看到的不完全一样,特别是因为彩色方块周围似乎有一些噪音,但这是我能得到的最接近的结果,有人可能会争辩说我产生的结果感觉上更好。
希望对您有所帮助!
从 2.10 开始,Gimp 以线性颜色工作 space,如果您查看该函数的原始源代码,它只是按位不是。所以,这是代码在 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