如何在OpenCV Python中改变图像亮度

12

我正在使用Python OpenCV读取一张图片,现在我需要改变这张图片的亮度,使其变得更暗或更亮,我应该使用哪种方法来实现?


1
照明并不是一个清晰的概念,在这种情况下。你能否提供一个例子,说明你想要实现什么? - Berriel
1
伽马校正怎么样? - dhanushka
3个回答

34

虽然我来晚了,但我建议使用Gamma校正

那么Gamma校正是什么呢?

我会用通俗易懂的语言来解释:

  • 要在屏幕上显示图像,需要输入电压。
  • 该电压将作为光强度输出。
  • 在理想情况下,输入电压将与输出强度成线性关系。
  • 但实际屏幕输出接近指数曲线,指数为gamma值

由于计算机屏幕对屏幕上的图像应用了Gamma值,因此应用反Gamma以抵消此效果的过程称为Gamma校正

enter image description here

以下是使用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()

这是原始图片:

enter image description here

应用0.5的伽马值将产生以下结果:

enter image description here

应用1.5的伽马值将产生以下结果:

enter image description here

应用2.5的伽马值将产生以下结果:

enter image description here

应用1.0的伽马值将得到相同的图像。

代码源自此链接


看起来源代码是https://www.pyimagesearch.com/2015/10/05/opencv-gamma-correction/(或者他可能从这里拿的:D) - ComputerScientist
@计算机科学家 不是的。实际上我是从那里拿来的。 :D - Jeru Luke
为了完整起见,答案本身应该明确说明。(我目前正在使用它来加深一些图像的颜色,效果很好。) - ComputerScientist
@计算机科学家 完成了!! - Jeru Luke

5

我认为你可以使用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()

这里我增加了图像的亮度。如果使用减法会使其变暗。


3

补充Jeru Luke所说的内容,确保两个数组都是np.uint8类型。函数cv.LUT的名称代表“查找表”。这意味着将从table中获取一个值来替换image中的每个像素。

你可以将两个数组进行转换:

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之前恢复有效类型。


1
cv2.imread 函数的返回值类型已经是 np.uint8。 - roachsinai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接