07_Opencv调整图像对比度和亮度
一.公式
dst = alpha*src + beta
- alpha > 0,控制图像对比度
- beta是增益变量,控制图像亮度
二.通过像素指针的方式实现对比度和亮度调节
Mat src = imread("/Users/zhixingao/Downloads/android/OpencvForCPlus/素材/莱娜.png");
if(src.empty()) {
cout << "could not load image 莱娜.png ...\n" << endl;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
//通过像素指针的方式调整图像的对比度和亮度
int rows = src.rows;
int cols = src.cols;
int channels = src.channels();
Mat dst(src.size(), src.type());
for(int row=0; row<rows; row++) {
const uchar* currentSrcRow = src.ptr<uchar>(row);
uchar* currentDstRow = dst.ptr<uchar>(row);
for(int col=0; col<cols*channels; col++) {
currentDstRow[col] = saturate_cast<uchar>(alpha * currentSrcRow[col] + beta);
}
}
namedWindow("output image", CV_WINDOW_AUTOSIZE);
imshow("output image", dst);

三.通过读写像素的方式实现对比度和亮度的调节
Mat src = imread("/Users/zhixingao/Downloads/android/OpencvForCPlus/素材/莱娜.png");
if(src.empty()) {
cout << "could not load image 莱娜.png ...\n" << endl;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
//通过读取像素的方式调整图像的对比度和亮度
int rows = src.rows;
int cols = src.cols;
int channels = src.channels();
Mat dst(src.size(), src.type());
for(int row=0; row<rows; row++) {
for(int col=0; col<cols; col++) {
if(channels == 3) {
Vec3b intensity = src.at<Vec3b>(row, col);
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(alpha*intensity[0] + beta);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(alpha*intensity[1] + beta);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(alpha*intensity[2] + beta);
} else if(channels == 1) {
uchar intensity = src.at<uchar>(row, col);
dst.at<uchar>(row, col) = saturate_cast<float>(alpha*intensity + beta);
}
}
}
namedWindow("output image", CV_WINDOW_AUTOSIZE);
imshow("output image", dst);
