您的位置:首页 > 运维架构

OpenCV--调整图像亮度和对比度

2017-11-29 11:27 357 查看
调整图像亮度和对比度的操作属于像素操作–点操作:

g(i,j)=αf(i,j)+β,其中α>0,β是增益变量

实例代码:

//调整图像亮度和对比度
void Demo(){
Mat src,dest;
src = imread("sanli.jpg");
if(!src.data){
cout << "图片打开失败!" << endl;
return;
}
namedWindow("原图像",CV_WINDOW_AUTOSIZE);
imshow("原图像",src);
dest = Mat::zeros(src.size(),src.type());
int rows = src.rows;
int cols = src.cols;
int n = src.channels();//通道数

float alpha = 1.5;
float beta = 30;
for(int row = 0;row<rows;row++){
for(int col = 0;col<cols;col++){
if(n==3){
int b = src.at<Vec3b>(row,col)[0];
int g = src.at<Vec3b>(row,col)[1];
int r = src.at<Vec3b>(row,col)[2];

dest.at<Vec3b>(row,col)[0] = saturate_cast<uchar>(alpha*b+beta);
dest.at<Vec3b>(row,col)[1] = saturate_cast<uchar>(alpha*g+beta);
dest.at<Vec3b>(row,col)[2] = saturate_cast<uchar>(alpha*r+beta);

}else{
if(n==1){
dest.at<uchar>(row,col) = saturate_cast<uchar>(alpha*src.at<uchar>(row,col)+beta);
}
}
}
}

namedWindow("增强后",CV_WINDOW_AUTOSIZE);
imshow("增强后",dest);
cvWaitKey();
}






注意如果我们觉得int b,g,r;不好,改成float类型那么我们会这样使用:

float b = src.at<Vec3f>(row,col)[0];
float g = src.at<Vec3f>(row,col)[1];
float r = src.at<Vec3f>(row,col)[2];


一旦我们运行就会产生错误:



解决方法:

在for循环之前添加代码:

src.convertTo(src,CV_32F);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息