如何在opencv python

时间:2015-10-24 19:34:47

标签: python opencv

我正在阅读python opencv中的图像,现在我需要将此图像上的照明更改为更暗或更亮,我应该使用哪种方法来启用此功能?

3 个答案:

答案 0 :(得分:11)

我知道我迟到了,但我建议使用 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的gamma将产生:

enter image description here

应用值为1.5的gamma将产生:

enter image description here

应用值为2.5的gamma将产生:

enter image description here

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

补充Jeru Luke的回答的一句话。确保两个数组的类型均为np.uint8cv.LUT函数名称代表“查找表”。这意味着将image中的每个像素替换为table中的值。

您可以转换两个数组:

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,而在调整伽玛之前忘记恢复有效类型。