调整图像亮度与对比度。
点操作是针对某个像素,如修改某个位置点像素值;邻域操作如卷积变换,是基于区域的操作。
Mat img = Mat::zeros(src.size(), src.type()); /定义空图像
saturate_cast<uchar>(value); //使value的值在0-255,value为一个像素值
img.at<Vec3b>(i, j)[0] = value; //给3通道img的i, j位置重新赋像素值value
img.at<uchar>(i, j) = value; //给单通道img像素赋值value
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(){
Mat src;
src = imread("/Users/ming/Documents/test.jpg");
// cvtColor(src, src, CV_BGR2GRAY);
if (! src.data){
printf("cannot load image ...");
}
namedWindow("src img", CV_WINDOW_AUTOSIZE);
imshow("src img", src);
int alpha = 1.9; //调节对比度
int beta = 30; //调节亮度
int heigth = src.rows;
int width = src.cols;
int channel = src.channels();
Mat dst = Mat::zeros(src.size(), src.type());
for (int i = 0; i < heigth; i++){
for (int j = 0 ; j < width; j++){
if (channel == 3){
int b = src.at<Vec3b>(i, j)[0];
int g = src.at<Vec3b>(i, j)[1];
int r = src.at<Vec3b>(i, j)[2];
dst.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(alpha * b + beta);
dst.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(alpha * g + beta);
dst.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(alpha * r + beta);
}
else{
int v = src.at<uchar>(i, j);
dst.at<uchar>(i, j) = saturate_cast<uchar>(alpha * v + beta);
}
}
}
imshow("Contrast brightness img", dst);
waitKey(0);
}