OpenCV 圖像對比度、亮度值調整


在圖像像素公式g(x)=a*f(x)+b其中:

  • 參數f(x)表示源圖像像素。
  • 參數g(x) 表示輸出圖像像素。
  • 參數a(需要滿足a>0)被稱為增益(gain),常常被用來控制圖像的對比度。
  • 參數b通常被稱為偏置(bias),常常被用來控制圖像的亮度。

為了訪問圖像的每一個像素,我們使用這樣的語法: image.at<Vec3b>(y,x)[c]

其中,y是像素所在的行, x是像素所在的列, c是R、G、B(對應0、1、2)其中之一。

因為我們的運算結果可能超出像素取值范圍(溢出),還可能是非整數(如果是浮點數的話),所以我們要用saturate_cast對結果進行轉換,以確保它為有效值。

這里的a也就是對比度,一般為了觀察的效果,取值為0.0到3.0的浮點值,但是我們的軌跡條一般取值都會整數,所以在這里我們可以,將其代表對比度值的nContrastValue參數設為0到300之間的整型,在最后的式子中乘以一個0.01,這樣就可以完成軌跡條中300個不同取值的變化。所以在式子中,我們會看到saturate_cast<uchar>( (g_nContrastValue*0.01)*(image.at<Vec3b>(y,x)[c] ) + g_nBrightValue )中的g_nContrastValue*0.01。

程序示例如下:

 1 #include <opencv2/core/core.hpp>
 2 #include<opencv2/highgui/highgui.hpp>
 3 #include"opencv2/imgproc/imgproc.hpp"
 4 #include <iostream>
 5  
 6 using namespace cv;  7  
 8  
 9 static void ContrastAndBright(int, void *); 10  
11 int g_nContrastValue; //對比度值
12 int g_nBrightValue;  //亮度值
13 Mat g_srcImage, g_dstImage; 14 //-----------------------------------【main( )函數】-------------------------------------------- 15 // 描述:控制台應用程序的入口函數,我們的程序從這里開始 16 //-----------------------------------------------------------------------------------------------
17 int main() 18 { 19     //改變控制台前景色和背景色
20     system("color5F"); 21  
22     //讀入用戶提供的圖像
23     g_srcImage = imread("8.jpg"); 24     if (!g_srcImage.data) { printf("讀取圖片失敗!\n"); return false; } 25     g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type()); 26  
27     //設定對比度和亮度的初值
28     g_nContrastValue = 80; 29     g_nBrightValue = 80; 30  
31     //創建窗口
32     namedWindow("結果", 1); 33  
34     //創建軌跡條
35     createTrackbar("對比度:", "結果", &g_nContrastValue, 300, ContrastAndBright); 36     createTrackbar("亮 度:", "結果", &g_nBrightValue, 200, ContrastAndBright); 37  
38     //調用回調函數
39     ContrastAndBright(g_nContrastValue, 0); 40     ContrastAndBright(g_nBrightValue, 0); 41  
42     //按下“q”鍵時,程序退出
43     while (char(waitKey(1)) != 'q') {} 44     return 0; 45 } 46  
47  
48 //-----------------------------【ContrastAndBright( )函數】------------------------------------ 49 // 描述:改變圖像對比度和亮度值的回調函數 50 //-----------------------------------------------------------------------------------------------
51 static void ContrastAndBright(int, void *) 52 { 53  
54     //創建窗口
55     namedWindow("原圖", 1); 56  
57     //三個for循環,執行運算 g_dstImage(i,j) =a*g_srcImage(i,j) + b
58     for (int y = 0; y < g_srcImage.rows; y++) 59  { 60         for (int x = 0; x < g_srcImage.cols; x++) 61  { 62             for (int c = 0; c < 3; c++) 63  { 64                 g_dstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>((g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue); 65  } 66  } 67  } 68  
69     //顯示圖像
70     imshow("原圖", g_srcImage); 71     imshow("結果", g_dstImage); 72 }

運行結果:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM