OpenCV基礎(四)---圖像對比度,亮度調整


圖像對比度,亮度調整

圖像對比度,指不同像素間的差值,差值越大,對比度越大.

圖像亮度,對於RGB圖像,亮度最大為(255,255,255),最暗為(0,0,0).

調整公式如上,f(x)為源圖像,g(x)為輸出圖像

       α為增益,用於設置圖像對比度

       β為偏置,用於調整圖像亮度

函數介紹:createTrackbar()

這里創建了兩個滑動條,用於調整α,β

函數原型: int createTrackbar(const String& trackbarname, const String& winname,
              int* value, int count,
              TrackbarCallback onChange = 0,
              void* userdata = 0);

參數說明:

const String& trackbarname:滑動條的名字

const String& winname:窗口的名稱,該窗口將用作創建的滑動條的父窗口

int* value:值可選指針,指向一個整型變量,其值反映滑塊的位置。創建時,滑塊位置由該變量定義

int count:滑塊的最大位置。最小位置總是0。

TrackbarCallback onChange = 0:指針指向每次滑塊改變位置時要調用的函數。這個函數的原型應該是void Foo(int,void\*);,其中第一個參數是trackbar位 置,第二個參數是用戶數據(參見下一個參數)。如果回調是空指針,則不調用回調,只更新值

void* userdata = 0: 作為回調函數傳遞的用戶數據。它可以在不使用全局變量的情況下處理trackbar事件

 

代碼演示

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 using namespace cv;
 6 
 7 Mat src, dst;
 8 const char * contrast_bar = "對比度";
 9 const char * bright_bar = "亮度";
10 const char * window_name = "效果圖";
11 int contrast_value;
12 int bright_value;
13 int max_contrast = 200;    //最大對比度,為2倍  
14 int max_bright = 100;   //最大偏置
15 int channels;
16 static void adjustContrastAndBright(int, void *);
17 
18 int main()
19 {
20     src = imread("D:/xiaobai.png");
21     if (src.empty()) {
22         cout << "could not load image..." << endl;
23         return false;
24     }
25     imshow("xiaobai", src);
26     dst = Mat::zeros(src.size(), src.type());
27     channels = src.channels();  //獲取圖像通道數
28     contrast_value = 100;  //設置初始對比度   
29     bright_value = 0;   //設置初始亮度
30 
31     namedWindow(window_name, CV_WINDOW_AUTOSIZE);
32 
33     //創建軌跡條
34     createTrackbar(contrast_bar, window_name, &contrast_value, max_contrast, adjustContrastAndBright);
35     createTrackbar(bright_bar, window_name, &bright_value, max_bright, adjustContrastAndBright);
36     
37     //調用回調函數
38     adjustContrastAndBright(contrast_value, 0);
39     adjustContrastAndBright(bright_value, 0);
40 
41     waitKey(0);
42     return 0;
43 }
44 
45 static void adjustContrastAndBright(int, void *)
46 {
47     switch (channels)
48     {
49     case 1:
50         for (int row = 0; row < src.rows; row++)
51             for (int col = 0; col < src.cols; col++){
52                 float v = src.at<uchar>(row, col);
53                 // saturate_cast 限制結果在0-255之間
54                 dst.at<uchar>(row, col) = saturate_cast<uchar>(v * contrast_value * 0.01 + bright_value); //調整
55         }
56     case 3:
57         for (int row = 0; row < src.rows; row++)
58             for (int col = 0; col < src.cols; col++) {
59                 float b = src.at<Vec3b>(row, col)[0];// blue
60                 float g = src.at<Vec3b>(row, col)[1]; // green
61                 float r = src.at<Vec3b>(row, col)[2]; // red            
62                 //調整
63                 dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b * contrast_value * 0.01 + bright_value);
64                 dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g * contrast_value * 0.01 + bright_value);
65                 dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r * contrast_value * 0.01 + bright_value);
66             }
67     }
68     imshow(window_name, dst);
69 }

原始圖像

效果圖

 

 

       

 


免責聲明!

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



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