簡體   English   中英

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

[英]how to change image illumination in opencv python

我在python opencv中讀取圖像,現在我需要將此圖像上的照明更改為更暗或更亮,我應該使用哪種方法來啟用此功能?

我知道我遲到了,但我建議使用伽瑪校正

現在什么是伽馬校正

我將以外行的方式說清楚:

  • 要在屏幕上顯示圖像,需要輸入電壓。
  • 該電壓作為光強度輸出。
  • 在完美的世界中,輸入電壓與輸出強度成線性關系。
  • 但實際屏幕輸出接近指數曲線,指數為伽瑪

由於計算機屏幕將伽瑪值應用於屏幕上的圖像,因此應用反伽馬來對抗該效果的過程稱為伽馬校正

在此輸入圖像描述

以下是使用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的gamma將產生:

在此輸入圖像描述

應用值為2.5的gamma將產生:

在此輸入圖像描述

應用值為1.0的伽瑪將產生相同的圖像。

代碼是從這個鏈接借來的

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

在這里,我增加了圖像的亮度。 如果你使用減法會變暗。

一個小小的評論補充Jeru Luke的答案。 確保兩個數組都是np.uint8類型。 cv.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 ,並且在調整伽瑪之前忘記恢復有效類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM