博客專欄

EEPW首頁 > 博客 > 獨家|OpenCV 1.6 改變圖像的對比度和亮度!

獨家|OpenCV 1.6 改變圖像的對比度和亮度!

發(fā)布人:數(shù)據(jù)派THU 時間:2021-08-20 來源:工程師 發(fā)布文章

目標

在本教程中, 你將學習到以下內(nèi)容:

訪問像素值;

用零初始化矩陣;

學習CV :: saturate_cast的作用及其有用的原因;

學習有關像素變換的很酷的知識;

提高圖像亮度的實例。

理論

下述解釋援引自理查德·斯?jié)衫够?Richard Szeliski)的<<計算機視覺算法和應用>>一書。 

圖像處理

常用的圖像處理操作是一個函數(shù),它將一個或多個圖像作為輸入并生成輸出圖像。

圖像變可被視為:

點運算符(像素變換);

鄰近(基于區(qū)域的)運算符。

像素變換

在圖像處理中, 每個輸出像素的值僅取決于相應的輸入像素值(可能還包括一些全局收集的信息或參數(shù));

此類操作實例包括亮度調(diào)整、對比度調(diào)整以及顏色的校正和轉(zhuǎn)換。

亮度和對比度調(diào)整

兩種常用對比度調(diào)整的方法是將像素值乘以或加上一個常數(shù):

1.png

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

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

2.png

其中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)

原文可下載源代碼(地址在文末)

下面的代碼執(zhí)行g(i,j)=α?f(i,j)+β操作

3.png

代碼詳解

C ++  

使用CV :: imread加載圖像并將其保存到Mat對象中:

4.png

接下來,對該圖像做一些轉(zhuǎn)換,為此需要創(chuàng)建一個新的Mat對象來存放它。此外,我們希望它具備以下特征:

初始像素值為零;

與原始圖像相同的尺寸和數(shù)據(jù)類型。

5.png

cv::Mat::zeros返回一個基于image.size()和image.type() 的Matlab格式的零初始化值。

我們現(xiàn)在要求用戶輸入α和β值:

6.png

為了執(zhí)行g(i,j)=α?f(i,j)+β操作,我們必須訪問圖像的每個像素。由于是對BGR圖像進行操作,所以每個像素包含(B,G和R)三個值,我們必須分別訪問它們。具體代碼如下:

7.png

注意(只適用于C ++代碼):

我們利用 image.at<Vec3b>(y,x)[c]來訪問圖像的各個像素,其中?是行號, X是列號,C是B,G或R(0,1或2);

由于α?p(i,j)+β 操作的值可能溢出或為非整數(shù)(如α是浮點數(shù)),我們用CV :: saturate_cast來確保該值的有效性;

最后,我們用以下方式創(chuàng)建窗口并顯示圖像。

8.png

我們利用以下簡單的命令來取代for循環(huán)來訪問圖像的每個像素:

9.png

cv::Mat::convertTo將執(zhí)行*new_image = a*image + beta*操作.。但是,我們想向你展示如何訪問每個像素。在任何情況下,這兩種方法都給出相同的結果,但 convertTo 更加優(yōu)化并且工作速度更快。

結果

我們不運行代碼,設置α = 2.2和β = 50。

10.png11.png

實例

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

圖像亮度和對比度調(diào)整

增大(或減小) β值將加大(/減?。└鱾€像素的對比度。像素值超出 [0; 255]范圍之外的值將會飽和(即:大于255,或小于0的像素值將鉗位到255或 0)。

12.png

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

直方圖表示該色彩像素中每種色彩的數(shù)目。深色圖像的像素值將大于淺色圖像的像素值,因此直方圖的左半部分會出現(xiàn)一個峰值。當添加一個恒定的偏差之后,整個直方圖右移,為所有的像素增加了一個恒定的偏置。

修改參數(shù)α將修改水平軸的展幅,如果α <1中,色彩值將被壓縮,其結果是圖像的對比度降低。

13.png

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

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

調(diào)整偏置參數(shù)β可以提高亮度,但同時,圖像的對比度會下降,圖像上似乎會蒙上一層輕微的面紗。調(diào)整增益α增益可緩釋這種效果,但是由于出現(xiàn)飽和,圖像將失去原有明亮區(qū)域的一些細節(jié)。

伽瑪校正

伽瑪校正利用輸入值和輸出映射值之間的非線性變換,校正圖像的亮度:

14.png

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

15.png

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

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

糾正曝光不足的圖像

我們設置α = 1.3和β = 40修正下面的圖像。

16.png

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

圖像的整體亮度得到了改善,但可以看出: 由于色彩的像素數(shù)值飽和,圖中云彩已經(jīng)飽和(攝影高光修剪)。

我們用γ=0.4修正下面的圖像。

17.png

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

由于映射是非線性的,伽馬校正添加了少量的飽和效應,并且不存在前面所述方法的數(shù)值飽問題。

18.png

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

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

在本教程中,描述了兩種調(diào)整圖像對比度和亮度簡單的方法。它們只是基本技術,不能用作光柵圖形編輯器的替代品!

代碼

C ++  

教程的源代碼請訪問原文(地址在文末)

伽馬校正的源代碼Code:

19.png

在這里,由于一次只需要計算256 個數(shù)值,利用查找表來提高計算性能。

更多資源

圖形渲染中的伽瑪校正

CRT監(jiān)視器的伽瑪校正和圖像顯示

數(shù)字曝光技術

注:本文以C++語言代碼為例,獲取Java和python版本可在原文中查看:

https://docs.opencv.org/4.5.2/d3/dc1/tutorial_basic_linear_transform.html

*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。

電度表相關文章:電度表原理


電能表相關文章:電能表原理


關鍵詞: AI

相關推薦

技術專區(qū)

關閉