OpenCV圖像對比度亮度調(diào)整
點擊下方卡片,關注“新機器視覺”公眾號
視覺/圖像重磅干貨,第一時間送達
來源:洞庭余人
理論依據(jù)
首先了解一下算子的概念,一般的圖像處理算子都是一個函數(shù),它接受一個或多個輸入圖像,并產(chǎn)生輸出圖像。下面是算子的一般形式。
g(x) = (h(f(x)) 或者 g(x) = h(f0(x)......fn(x))
圖像亮度和對比度的操作,其實屬于圖像處理變換中比較簡單的一種-點操作(point operators)。點操作有一個特點:僅僅根據(jù)輸入像素值來計算相應的輸出像素值。這類算子包括亮度(brightness)和對比度(contrast)調(diào)整、顏色校正(color correction)和變換(transformations)。
兩種最常見的點操作是乘上一個常數(shù)(對比度的調(diào)節(jié))以及加上一個常數(shù)(亮度值的調(diào)節(jié))。公式如下:
g(x) = a * f(x) + b
f(x) 表示原圖像像素。
g(x) 表示輸出圖像像素。
參數(shù) a( a > 0)被稱為增益,常用來控制圖像的對比度。
參數(shù) b 通常稱為偏置(bias),常用來控制圖像的亮度。
進一步,我們這樣改寫這個公式:
g(i,j) = a * f(i,j) + b
其中i,j 表示像素位于第 i 行和第 j 列,這個公式可以用來作為我們在 OpenCV 中控制圖像亮度和對比度的理論公式。
示例程序
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
#define WINDOW_NAME "Tracker"
const int MAX_VALUE = 100;
int contrastValue; //對比度
int brightnessValue; //亮度
Mat src;
Mat dstImage;
void onTrack(int, void *) {
for (int row = 0; row < src.rows; row++) {
//列
for (int col = 0; col < src.cols; col++) {
Vec3b pixels = src.at<Vec3b>(row, col);
dstImage.at<Vec3b>(row, col)[0] = saturate_cast<uchar>((contrastValue * 0.01) * pixels[0] + brightnessValue);
dstImage.at<Vec3b>(row, col)[1] = saturate_cast<uchar>((contrastValue * 0.01) * pixels[1] + brightnessValue);
dstImage.at<Vec3b>(row, col)[2] = saturate_cast<uchar>((contrastValue * 0.01) * pixels[2] + brightnessValue);
}
}
imshow(WINDOW_NAME,dstImage);
imwrite("../opencv_contrast_brightness.jpg",dstImage);}int main() {
//讀取圖片
src = imread("../lena.png");
dstImage = Mat::zeros(src.size(), src.type());
//顯示圖片
imshow("Tracker", src);
contrastValue = 60;
brightnessValue = 50;
namedWindow(WINDOW_NAME, WINDOW_NORMAL);
createTrackbar("Contrast", WINDOW_NAME, &contrastValue, MAX_VALUE, onTrack);
createTrackbar("Brightness", WINDOW_NAME, &brightnessValue, MAX_VALUE, onTrack);
onTrack(contrastValue, 0);
onTrack(brightnessValue, 0);
waitKey(0);
return 0;}

—版權(quán)聲明—
僅用于學術分享,版權(quán)屬于原作者。
若有侵權(quán),請聯(lián)系微信號:yiyang-sy 刪除或修改!
評論
圖片
表情
