![]() |
OpenCV 4.12.0
開源計算機視覺
|
上一個教程: 使用OpenCV新增(混合)兩幅影像
下一個教程: 離散傅立葉變換
| 原始作者 | Ana Huamán |
| 相容性 | OpenCV >= 3.0 |
在本教程中,您將學習如何
兩種常用的點處理是與常數進行乘法和加法運算
\[g(x) = \alpha f(x) + \beta\]
您可以將 \(f(x)\) 視為源影像畫素,將 \(g(x)\) 視為輸出影像畫素。然後,我們可以更方便地將表示式寫為
\[g(i,j) = \alpha \cdot f(i,j) + \beta\]
其中 \(i\) 和 \(j\) 表示畫素位於第 i 行和第 j 列。
我們觀察到 cv::Mat::zeros 根據 image.size() 和 image.type() 返回一個 Matlab 風格的零初始化器
請注意以下內容(僅限 C++ 程式碼)
其中 cv::Mat::convertTo 會有效地執行 *new_image = a*image + beta*。然而,我們想向你展示如何訪問每個畫素。無論如何,這兩種方法都給出相同的結果,但 convertTo 更最佳化,執行速度快得多。
在本段中,我們將學到的知識付諸實踐,透過調整影像的亮度和對比度來校正曝光不足的影像。我們還將介紹另一種校正影像亮度的技術,稱為伽馬校正。
增加(/減少)\(\beta\) 值將為每個畫素新增(/減去)一個常數值。超出 [0 ; 255] 範圍的畫素值將被飽和(即,高於 255(/低於 0)的畫素值將被限制在 255(/0))。
直方圖表示每個顏色級別擁有該顏色級別的畫素數量。黑暗影像會有許多顏色值較低的畫素,因此直方圖會在其左側呈現一個峰值。當新增一個常數偏置時,由於我們為所有畫素添加了一個常數偏置,直方圖會向右移動。
\(\alpha\) 引數將改變色階的分佈方式。如果 \( \alpha < 1 \),色階將被壓縮,結果將是對比度較低的影像。
請注意,這些直方圖是使用 Gimp 軟體中的亮度-對比度工具獲得的。亮度工具應該與 \(\beta\) 偏置引數相同,但對比度工具似乎與 \(\alpha\) 增益不同,在 Gimp 中輸出範圍似乎是居中的(正如您可以在之前的直方圖中注意到的)。
可能會出現這樣的情況:調整 \(\beta\) 偏置會改善亮度,但同時影像會顯得略帶蒙版,因為對比度會降低。使用 \(\alpha\) 增益可以減弱這種效果,但由於飽和度,我們將在原始亮部區域丟失一些細節。
伽馬校正 可透過輸入值與對映輸出值之間的非線性變換來校正影像的亮度
\[O = \left( \frac{I}{255} \right)^{\gamma} \times 255\]
由於這種關係是非線性的,其效果對所有畫素並非相同,而是取決於它們的原始值。
當 \( \gamma < 1 \) 時,原始暗部區域會更亮,直方圖將向右移動;而當 \( \gamma > 1 \) 時,效果則相反。
以下影像已使用 \( \alpha = 1.3 \) 和 \( \beta = 40 \) 進行校正。
整體亮度得到了改善,但您可能會注意到,由於所用實現中的數值飽和(攝影中的高光裁剪),雲彩現在嚴重飽和。
以下影像已使用 \( \gamma = 0.4 \) 進行校正。
伽馬校正應該會減少飽和效果,因為對映是非線性的,並且不像之前的方法那樣可能出現數值飽和。
上圖比較了三幅影像的直方圖(三個直方圖的 Y 軸範圍不同)。您可以注意到,原始影像的大部分畫素值都集中在直方圖的低端。經過 \( \alpha \), \( \beta \) 校正後,由於飽和以及向右的偏移,我們可以在 255 處觀察到一個大峰值。經過伽馬校正後,直方圖向右移動,但暗部區域的畫素比亮部區域的畫素移動得更多(參見伽馬曲線圖)。
在本教程中,您已經學習了兩種調整影像對比度和亮度的簡單方法。它們是基本技術,並非旨在取代光柵圖形編輯器!
伽馬校正程式碼
查詢表用於提高計算效能,因為只需計算一次 256 個值。