如何在opencv python中更改图像照明

如何在opencv python中更改图像照明,python,opencv,Python,Opencv,我正在阅读python opencv中的一幅图像,现在我需要将该图像上的照明更改为更暗或更亮,我应该使用什么样的方法来启用它 我想你可以用opencv来完成这项工作。这是我的建议 import cv2 import numpy as np img1 = cv2.imread('abc.jpg') a = np.double(img1) b = a + 15 img2 = np.uint8(b) cv2.imshow("frame",img1) cv2.imshow("frame2",img2)

我正在阅读python opencv中的一幅图像,现在我需要将该图像上的照明更改为更暗或更亮,我应该使用什么样的方法来启用它

我想你可以用opencv来完成这项工作。这是我的建议

import cv2
import numpy as np

img1 = cv2.imread('abc.jpg')
a = np.double(img1)
b = a + 15
img2 = np.uint8(b)
cv2.imshow("frame",img1)
cv2.imshow("frame2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里我增加了图像的亮度。如果你使用减法,会使颜色变暗

我知道我迟到了,但我建议使用伽马校正

现在什么是伽马校正

我会用外行的话说清楚:

  • 要在屏幕上显示图像,需要输入电压
  • 该电压作为光强度输出
  • 在理想情况下,输入电压和输出强度成线性关系
  • 但实际屏幕输出接近于指数曲线 指数为伽马
由于计算机屏幕将伽马值应用于屏幕上的图像,因此应用逆伽马来抵消此影响的过程称为伽马校正

下面是使用OpenCV 3.0.0和python的代码:

import cv2
import numpy as np

def adjust_gamma(image, gamma=1.0):

   invGamma = 1.0 / gamma
   table = np.array([((i / 255.0) ** invGamma) * 255
      for i in np.arange(0, 256)]).astype("uint8")

   return cv2.LUT(image, table)

x = 'C:/Users/524316/Desktop/stack/test.jpg'  #location of the image
original = cv2.imread(x, 1)
cv2.imshow('original',original)

gamma = 0.5                                   # change the value here to get different result
adjusted = adjust_gamma(original, gamma=gamma)
cv2.putText(adjusted, "g={}".format(gamma), (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 3)
cv2.imshow("gammam image 1", adjusted)

cv2.waitKey(0)
cv2.destroyAllWindows()
以下是原始图像:

应用值为0.5的gamma将产生:

应用伽马值1.5将产生:

应用伽马值2.5将产生:

应用值为1.0的gamma将生成相同的图像


补充杰鲁·卢克回答的一句话。确保两个数组的类型均为
np.uint8
cv.LUT
函数名代表“查找表”。这意味着
图像
中的每个像素将替换为
中的一个值

您可以转换两个阵列:

def adjust_gamma(image, gamma=1.0):
   invGamma = 1.0 / gamma
   table = np.array([
      ((i / 255.0) ** invGamma) * 255
      for i in np.arange(0, 256)])
   return cv2.LUT(image.astype(np.uint8), table.astype(np.uint8))

或者在传递到
adjust_gamma()
函数之前,确保图像数组已强制转换为有效类型。在应用各种变换时,很容易将图像转换为
float
,并且在调整gamma之前忘记恢复有效类型。

在这种情况下,照明不是一个明确的概念。你能举个例子说明你想达到什么目的吗?怎么样?看起来来源是(或者可能是他从这里得到的:D)@ComputerScientist Nope。实际上是我从那里拿的为确保完整性,DIt可能应在答案中说明。(我目前正在使用它来加深一些图像,对我来说效果很好。)@ComputerScientist Done!!