OpenCV之亮度、对比度详解
一、亮度和對比度調整的理論依據
首先我們給出算子的概念。一般的圖像處理算子都是一個函數,它接受一個或多個輸入圖像,并產生輸出圖像。下式給出了算子的一般形式:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??或者
今天我們所講解的圖像亮度和對比度的調整操作,其實屬于圖像處理變換中比較簡單的一種——點操作(pointoperators)。點操作有一個特點,僅僅根據輸入像素值(有時可加上某些全局信息或參數),來計算相應的輸出像素值。這類算子包括亮度(brightness)和對比度(contrast)調整,以及顏色校正(colorcorrection)和變換(transformations)。
?
最兩種常用的點操作(或者說點算子),很顯然,是乘上一個常數(對應對比度的調節)以及加上一個常數(對應亮度值的調節)。用公式表示出來就是這樣:
? ? ? ? ? ??
?
看到這個式子,我們關于圖像亮度和對比度調整的策略就呼之欲出了。
其中:
- 參數f(x)表示源圖像像素。
- 參數g(x) 表示輸出圖像像素。
- 參數a(需要滿足a>0)被稱為增益(gain),常常被用來控制圖像的對比度。
- 參數b通常被稱為偏置(bias),常常被用來控制圖像的亮度。
而更近一步,我們這樣改寫這個式子:
其中,i 和 j 表示像素位于第i行 和 第j列 。
那么,這個式子就可以用來作為我們在OpenCV中控制圖像的亮度和對比度的理論公式,其實現方法可以通過addWeighted函數或for逐個訪問圖像像素實現。
例程:
// Bright_and_Contrast.cpp : 定義控制臺應用程序的入口點。 //#include "stdafx.h" #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream>using namespace std; using namespace cv;Mat srcImage; int bright_init=1; int contrast_init=1;void bright_track(int,void*) {Mat dstImage;//調用函數實現addWeighted(srcImage,1,srcImage,0,bright_init,dstImage);/************************************************************************//* 訪問圖像中像素實現三個for循環,執行運算 new_image(i,j) =a*image(i,j) + b Mat dstImage(srcImage.rows,srcImage.cols,srcImage.type());for(int y = 0; y < srcImage.rows; y++ ) { for(int x = 0; x < srcImage.cols; x++ ) { for(int c = 0; c < 3; c++ ) { //使用saturate_cast防止像素值超值或者為浮點數dstImage.at<Vec3b>(y,x)[c]= saturate_cast<uchar>( (contrast_init*0.01)*(srcImage.at<Vec3b>(y,x)[c] ) + bright_init ); } } } *//************************************************************************/ imshow("Image",dstImage); } void contrast_track(int,void*) {Mat dstImage;addWeighted(srcImage,contrast_init*0.02,srcImage,0,0,dstImage);/************************************************************************//* 訪問圖像中像素實現三個for循環,執行運算 new_image(i,j) =a*image(i,j) + b Mat dstImage(srcImage.rows,srcImage.cols,srcImage.type());for(int y = 0; y < srcImage.rows; y++ ) { for(int x = 0; x < srcImage.cols; x++ ) { for(int c = 0; c < 3; c++ ) { //使用saturate_cast防止像素值溢出或者為浮點數dstImage.at<Vec3b>(y,x)[c]= saturate_cast<uchar>( (contrast_init*0.01)*(srcImage.at<Vec3b>(y,x)[c] ) + bright_init ); } } } *//************************************************************************/ imshow("Image",dstImage); }int _tmain(int argc, _TCHAR* argv[]) {srcImage=imread("1.jpg",1);if (srcImage.empty()){cout<<"讀入文件錯誤"<<endl;return -1;}namedWindow("Image",CV_WINDOW_NORMAL);imshow("Image",srcImage);createTrackbar("亮度","Image",&bright_init,100,bright_track);createTrackbar("對比度","Image",&contrast_init,100,contrast_track);waitKey(0);return 0; }
總結
以上是生活随笔為你收集整理的OpenCV之亮度、对比度详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: go 打包到不同平台windows li
- 下一篇: 内网安全 信息收集(收集内网计算机的所有