1. 程式人生 > >OpenCV基礎(四)---圖像對比度,亮度調整

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

user foo 情況下 取圖 可選 演示 mage con enc

圖像對比度,亮度調整

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

圖像亮度,對於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 }

原始圖像

技術分享圖片

效果圖

技術分享圖片

       

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