如何改變影象的對比度和亮度

影象處理

常用的影象處理操作是一個函式,它將一個或多個影象作為輸入並生成輸出影象。

影象變可被視為:點運算子(畫素變換);鄰近(基於區域的)運算子。

畫素變換

在影象處理中,

每個輸出畫素的值僅取決於相應的輸入畫素值(可能還包括一些全域性收集的資訊或引數);

此類操作例項包括亮度調整、對比度調整以及顏色的校正和轉換。

亮度和對比度調整

兩種常用對比度調整的方法是將畫素值乘以或加上一個常數:

如何改變影象的對比度和亮度

引數α > 0和β通常稱為增益引數和偏置引數,透過這兩個引數分別來控制對比度和亮度。

F ( X )為源影象的畫素,G ( X )為輸出影象的畫素。可以方便地寫出以下表達式:

其中i和j表示位於

i

行,

j

列的畫素

程式碼

C ++

(Java 版本請訪問: https://github。com/opencv/opencv/blob/master/samples/java/tutorial_code/ImgProc/changing_contrast_brightness_image/BasicLinearTransformsDemo。java

Python 版本請訪問: https://github。com/opencv/opencv/blob/master/samples/python/tutorial_code/imgProc/changing_contrast_brightness_image/BasicLinearTransforms。py)

單擊 這裡,可以下載原始碼

下面的程式碼執行g(i,j)=α⋅f(i,j)+β操作

如何改變影象的對比度和亮度

程式碼詳解

C ++

使用

CV :: imread

載入影象並將其儲存到Mat物件中:

如何改變影象的對比度和亮度

接下來,對該影象做一些轉換,為此需要建立一個新的Mat物件來存放它。此外,我們希望它具備以下特徵:

初始畫素值為零;

與原始影象相同的尺寸和資料型別。

cv::Mat::zeros

返回一個基於image。size()和image。type() 的Matlab格式的零初始化值。

我們現在要求使用者輸入α和β值:

如何改變影象的對比度和亮度

為了執行g(i,j)=α⋅f(i,j)+β操作,我們必須訪問影象的每個畫素。由於是對BGR影象進行操作,所以每個畫素包含(B,G和R)三個值,我們必須分別訪問它們。具體程式碼如下:

如何改變影象的對比度和亮度

注意(

只適用於C ++程式碼

):

我們利用 image。at(y,x)[c]來訪問影象的各個畫素,其中ÿ是行號, X是列號,C是B,G或R(0,1或2);

由於α⋅p(i,j)+β 操作的值可能溢位或為非整數(如α是浮點數),我們用

CV :: saturate_cast來

確保該值的有效性;

最後,我們用以下方式建立視窗並顯示影象。

如何改變影象的對比度和亮度

我們利用以下簡單的命令來取代

for

迴圈來訪問影象的每個畫素:

如何改變影象的對比度和亮度

cv::Mat::convertTo

將執行*new_image = a*image + beta*操作。。但是,我們想向你展示如何訪問每個畫素。 在任何情況下,這兩種方法都會給出相同的結果,但 convertTo 更加最佳化並且工作速度更快。

結果

我們不執行程式碼,設定α = 2。2和β = 50。

如何改變影象的對比度和亮度

如何改變影象的對比度和亮度

例項

在本小節中,我們將以前學到的技巧付諸實戰,透過調整影象的亮度和對比度來校正曝光不足的圖片。同時,學習利用伽瑪校正(gamma correction)技術來校正影象的亮度。

影象亮度和對比度調整

增大(或減小) β值將加大(/減小)各個畫素的對比度。畫素值超出 [0; 255]範圍之外的值將會飽和(即:大於255,或小於0的畫素值將定位到255或 0)。

如何改變影象的對比度和亮度

原始影象的淺灰色直方圖中,深灰色亮度= 80 GIMP

直方圖表示該色彩畫素中每種色彩的數目。深色影象的畫素值將大於淺色影象的畫素值,因此直方圖的左半部分會出現一個峰值。當新增一個恆定的偏差之後,整個直方圖右移,為所有的畫素增加了一個恆定的偏置。

修改引數α將修改水平軸的展幅,如果α <1中,色彩值將被壓縮,其結果是影象的對比度降低。

如何改變影象的對比度和亮度

原影象的淺灰色直方圖中,深灰色時, 對比度GIMP <0

注意,利用對比度/亮度工具Gimp獲得的上述柱狀圖,亮度工具的偏置引數β應該與之相同,但對比度工具的增益引數α是不同的(可以從前面的直方圖中看出)。

調整偏置引數β可以提高亮度,但同時,影象的對比度會下降,影象上似乎會蒙上一層輕微的面紗。調整增益α增益可緩釋這種效果,但是由於出現飽和,影象將失去原有明亮區域的一些細節。

伽瑪校正

伽瑪校正

利用輸入值和輸出對映值之間的非線性變換,校正影象的亮度:

如何改變影象的對比度和亮度

由於這種關係是非線性的,其效果不會影響所有的畫素,最終輸出將取決於畫素的原始值。

如何改變影象的對比度和亮度

打印出不同的伽瑪值(gamma)

當γ <1時,,原始影象的暗區將變得更加明亮,整個直方圖將右移;當γ > 1時, 原始影象的亮區將變得更暗,整個直方圖將左移。

糾正曝光不足的影象

我們設定α = 1。3和β = 40修正下面的影象。

如何改變影象的對比度和亮度

圖: Visem的作品 [CC BY-SA 3.0],來源:維基共享資源

影象的整體亮度得到了改善,但可以看出: 由於色彩的畫素數值飽和,圖中雲彩已經飽和(攝影

高光修剪

)。

我們用γ=0。4修正下面的影象。

如何改變影象的對比度和亮度

圖: Visem的作品 [CC BY-SA 3.0],來源:維基共享資源

由於對映是非線性的,伽馬校正添加了少量的飽和效應,並且不存在前面所述方法的數值飽問題。

如何改變影象的對比度和亮度

左邊:α,β校正後的直方圖;中間:原始影象的直方圖;右邊:伽馬校正後的直方圖

上圖比較了三幅影象(三個直方圖的y值不相同)的直方圖。從中可以發現,大部分的畫素值都在原始影象直方圖的下部。α , β修正後,由於影象出現飽和,在255 處可以觀察到一個峰值,整個直方圖右移。伽瑪校正後,直方圖右移,影象暗區域中的畫素移動的位移比在明亮區域畫素移動的位移更大(見伽瑪曲線圖)。

在本教程中,描述了兩種調整影象對比度和亮度簡單的方法。

它們只是基本技術,不能用作光柵圖形編輯器的替代品!

程式碼

C ++

教程的原始碼請訪問

這裡

伽馬校正的原始碼Code:

如何改變影象的對比度和亮度

在這裡,由於一次只需要計算256 個數值,利用查詢表來提高計算效能。

更多資源

圖形渲染中的

伽瑪校正

CRT監視器的

伽瑪校正和影象顯示

數字曝光技術