1、對比度、亮度概念普及
1.1對比度
對比度指的是一幅圖像中明暗區域最亮的白和最暗的黑之間不一樣亮度層級的測量,差別範圍越大表明對比越大,差別範圍越小表明對比越小。對比度對視覺效果的影響很是關鍵,通常來講對比度越大,圖像越清晰醒目,色彩也越鮮明豔麗;而對比度小,則會讓整個畫面都灰濛濛的。高對比度對於圖像的清晰度、細節表現、灰度層次表現都有很大幫助。相對而言,對比度對灰度圖的影響要比彩圖大。ios
提升圖像對比度的方法:讓白色區域更亮,黑色區域更暗。less
1.2亮度
亮度是一個相對概念,取決於視覺感覺。對數字圖像而言,提升/下降亮度的方法就是增長/減少像素對應通道的灰度值。函數
1.3代碼中用到的調節公式
g(i,j) = a * f(i,j) + bspa
f(i,j)是原圖像,g(i,j)是調節後的圖像,a是對比度拉伸係數,b是對亮度的偏置值。.net
2、代碼
2.1代碼以下
#include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int iContrastValue = 100; int iBrightValue = 0; Mat srcImage; Mat dstImage; //Change the pixel values void ChangePixelValue(Mat inputImage, Mat outputImage) { for (int i = 0; i < inputImage.rows; i++) for (int j = 0; j < inputImage.cols; j++) for (int k = 0; k < inputImage.channels(); k++) outputImage.at<Vec3b>(i, j)[k] = saturate_cast<uchar>(inputImage.at<Vec3b>(i, j)[k] * iContrastValue / 100 + iBrightValue); imshow("The modified image", dstImage); } //Change the contrast value void ChangeContrastValue(int, void*) { ChangePixelValue(srcImage, dstImage); } //Change the bright value void ChangeBrightValue(int, void*) { ChangePixelValue(srcImage, dstImage); } int main() { srcImage = imread("toothless.jpg", 1); dstImage = Mat::zeros(srcImage.size(), srcImage.type()); if (srcImage.data == 0) { cerr << "Image reading error !" << endl; return -1; } namedWindow("The original image", WINDOW_NORMAL); imshow("The original image", srcImage); //Create two trackbars namedWindow("The modified image", WINDOW_NORMAL); createTrackbar("The contrast value", "The modified image", &iContrastValue, 300, ChangeContrastValue, 0); ChangeContrastValue(iContrastValue, 0); createTrackbar("The bright value", "The modified image", &iBrightValue, 20, ChangeBrightValue, 0); ChangeBrightValue(iBrightValue, 0); waitKey(); return 0; }
2.2代碼經驗
2.2.1createTrackbar()函數的使用
參見https://blog.csdn.net/mysee1989/article/details/41379817,較爲詳細。code
2.2.2saturate_cast<>()防溢出函數的使用
通常狀況下圖像灰度值的範圍都在0--255之間(CV_8U),但本程序涉及到乘法、加法等線性運算,數值很容易超出255,形成數據溢出。可用saturate_cast<>()防溢出函數將超出的值拉回範圍內。拉回超範圍值的原則遵循:超過上限的元素統一賦值爲上限值,低於下限的元素統一賦值爲下限值。blog
uchar a = saturate_cast<uchar>(-100); // 低於下限賦值爲uchar_min:a = 0 short b = saturate_cast<short>(33333.33333); //高於上限賦值爲short_max: b = 32767
2.2.3imshow()函數的放置
程序最後用imshow()函數對調節後的圖像進行顯示時,必定要將imshow()函數放進滑動條的回調函數內部,不然改變滑動條參數後,雖然圖像矩陣的數值也會發生改變,但imshow()並不會載入新的圖像矩陣並刷新顯示。get
注:錯誤之處,敬請雅正!input