1. 程式人生 > >opencv-python 影象灰度變換

opencv-python 影象灰度變換

  灰度變換作為一種影象預處理技術可以顯著的改善影象的質量,下面將介紹幾種灰度變換的方法

1. gamma 變換

  Gamma變換是對輸入影象灰度值進行的非線性操作,使輸出影象灰度值與輸入影象灰度值呈指數關係:

s = c r λ

s = cr^{\lambda}

這個指數即為Gamma。

Gamma變換就是用來影象增強,其提升了暗部細節,簡單來說就是通過非線性變換,讓影象從暴光強度的線性響應變得更接近人眼感受的響應,即將漂白(相機曝光)或過暗(曝光不足)的圖片,進行矯正。

經過Gamma變換後的輸入和輸出影象灰度值關係如圖1所示:橫座標是輸入灰度值,縱座標是輸出灰度值,藍色曲線是gamma值小於1時的輸入輸出關係,紅色曲線是gamma值大於1時的輸入輸出關係。可以觀察到,當gamma值小於1時(藍色曲線),影象的整體亮度值得到提升,同時低灰度處的對比度得到增加,更利於分辯低灰度值時的影象細節。

1.1 實現程式碼

  下面是就 python2.7 和 opencv 的實現

def gamma_trans(img,gamma):
	#具體做法先歸一化到1,然後gamma作為指數值求出新的畫素值再還原
	gamma_table = [np.power(x/255.0,gamma)*255.0 for x in range(256)]
	gamma_table = np.round(np.array(gamma_table)).astype(np.uint8)
	#實現對映用的是Opencv的查表函式
	return cv2.LUT(img0,gamma_table)

在上面我們看到沒有每次都計算一次指數,因為指數的計算複雜度很高,這裡我們儲存下計算結果,然後使用查表的方法來節省計算時間。但是上面這段程式碼還可以繼續優化,因為每呼叫一次這個函式就要計算一遍需要查詢的表格,當引數 λ

\lambda 不變的時候,我們可以先計算出需要查的表,然後對每一張影象查表即可。

參考

[1] CSDN 京局京段藍白豬《Python-OpenCV中的Gamma變換(校正)》

s