博客專欄

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

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

        發布人:數據派THU 時間:2021-08-20 來源:工程師 發布文章

        目標

        在本教程中, 你將學習到以下內容:

        訪問像素值;

        用零初始化矩陣;

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

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

        提高圖像亮度的實例。

        理論

        下述解釋援引自理查德·斯澤利斯基(Richard Szeliski)的<<計算機視覺算法和應用>>一書。 

        圖像處理

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

        圖像變可被視為:

        點運算符(像素變換);

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

        像素變換

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

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

        亮度和對比度調整

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

        1.png

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

        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)

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

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

        3.png

        代碼詳解

        C ++  

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

        4.png

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

        初始像素值為零;

        與原始圖像相同的尺寸和數據類型。

        5.png

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

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

        6.png

        為了執行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)+β 操作的值可能溢出或為非整數(如α是浮點數),我們用CV :: saturate_cast來確保該值的有效性;

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

        8.png

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

        9.png

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

        結果

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

        10.png11.png

        實例

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

        圖像亮度和對比度調整

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

        12.png

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

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

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

        13.png

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

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

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

        伽瑪校正

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

        14.png

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

        15.png

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

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

        糾正曝光不足的圖像

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

        16.png

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

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

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

        17.png

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

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

        18.png

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

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

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

        代碼

        C ++  

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

        伽馬校正的源代碼Code:

        19.png

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

        更多資源

        圖形渲染中的伽瑪校正

        CRT監視器的伽瑪校正和圖像顯示

        數字曝光技術

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

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

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。

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


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


        關鍵詞: AI

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 澄迈县| 屯留县| 楚雄市| 琼结县| 苍梧县| 朝阳区| 富源县| 梨树县| 化州市| 家居| 准格尔旗| 错那县| 龙川县| 德阳市| 平乐县| 万载县| 汤阴县| 梁山县| 铁力市| 嘉兴市| 霍林郭勒市| 孙吴县| 疏勒县| 尼勒克县| 米脂县| 浪卡子县| 金门县| 盐山县| 平顶山市| 晋城| 涟水县| 黄平县| 锦州市| 奇台县| 左权县| 抚顺县| 瓦房店市| 松溪县| 上栗县| 金山区| 耒阳市|