Gamma校正及其OpenCV實現

2021-06-21 08:14:03 字數 1796 閱讀 4958

一、什麼是gamma校正?

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

這個指數即為gamma.

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

圖1 gamma校正.

二、為什麼進行gamma校正?

1. 人眼對外界光源的感光值與輸入光強不是呈線性關係的,而是呈指數型關係的。在低照度下,人眼更容易分辨出亮度的變化,隨著照度的增加,人眼不易分辨出亮度的變化。而攝像機感光與輸入光強呈線性關係。如圖2所示:

圖2 人眼和攝像機的感光與實際輸入光強的關係[1]。

為方便人眼辨識影象,需要將攝像機採集的影象進行gamma校正。

2. 為能更有效的儲存影象亮度資訊,需進行gamma校正。

未經gamma校正和經過gamma校正儲存影象資訊如圖3所示:

圖3 未經gamma校正和經過gamma校正儲存影象資訊.

可以觀察到,未經gamma校正的情況下,低灰度時,有較大範圍的灰度值被儲存成同乙個值,造成資訊丟失;同時高灰度值時,很多比較接近的灰度值卻被儲存成不同的值,造成空間浪費。經過gamma校正後,改善了儲存的有效性和效率。

三、利用opencv實現的gamma校正

[cpp]view plain

copy

print

?voidmygammacorrection(mat& src, mat& dst,floatfgamma)  

dst = src.clone();  

const

intchannels = dst.channels();  

switch(channels)  

case3:   

break;  

}  }  

}  

void mygammacorrection(mat& src, mat& dst, float fgamma)

dst = src.clone();

const int channels = dst.channels();

switch(channels)

case 3:

break;}}}

[cpp]view plain

copy

print

?

"blog_20140329_1_2068731"

code_snippet_id="263311"

>

Gamma校正及其OpenCV實現

參考 1 2 一 什麼是gamma校正?gamma校正是對輸入影象灰度值進行的非線性操作,使輸出影象灰度值與輸入影象灰度值呈指數關係 這個指數即為gamma.經過gamma校正後的輸入和輸出影象灰度值關係如圖1所看到的 橫座標是輸入灰度值,縱座標是輸出灰度值,藍色曲線是gamma值小於1時的輸入輸出...

Gamma校正及其OpenCV實現

參考 1 2 一 什麼是gamma校正?gamma校正是對輸入影象灰度值進行的非線性操作,使輸出影象灰度值與輸入影象灰度值呈指數關係 這個指數即為gamma.經過gamma校正後的輸入和輸出影象灰度值關係如圖1所看到的 橫座標是輸入灰度值,縱座標是輸出灰度值,藍色曲線是gamma值小於1時的輸入輸出...

gamma校正 OpenCV Gamma校正

gamma校正是一種非常重要的線性變換。對輸入影象的灰度值進行指數變換,進而校正亮度偏差,通常應用於擴充套件暗調的細節。gamma校正可使得影象看起來更符合人眼的特性。當gamma校正的值大於1時,影象的高光部分被壓縮而暗調部分被擴充套件 當gamma校正的值小於1時,影象的高光部分被壓縮而暗調部分...