opencv--图像色彩和对比度
处理图像经常会对图像色彩进行增强,这就是改变图像的亮度和对比度。本章基于opencv对图像的亮度和对比度进行处理操作。其实,这是对图像的每一个像素点进行相应的操作。
在这个公式中
- alpha
第一个参数α必须是大于零,不然则基本上没有意义了。
α能使图像像素成倍数的增长或降低(α<1),改变了是图像的对比度,因为使图像的差值变化了。 - beta
β可为负,也可为正。
任何一个像素都在(0, 255)之间,加上一个值或减去一个值则会使这个像素点变大或变小,其实就是向白色或向黑色靠近(0为黑,255为白),所以改变的是图像的亮度。
相关函数
实例
int main() {
Mat src,src1 ,dst;
src = imread("D:/test/first.png",0);
if (!src.data) {
cerr << "open error" << endl;
return -1;
}
dst = Mat::zeros(src.size(), src.type());
float alpha = 1.2;
float beta = 30;
int rows = src.rows;
int cols = src.cols;
int channals = src.channels();
src.convertTo(src1, CV_32F);
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
if (channals == 1) {
float s = src.at<uchar>(row, col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(alpha * s + beta);
}
else {
float b = src1.at<Vec3f>(row, col)[0];
float g = src1.at<Vec3f>(row, col)[1];
float r = src1.at<Vec3f>(row, col)[2];
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(alpha * b + beta);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(alpha * g + beta);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(alpha * b + beta);
}
}
}
imshow("yuantu", src);
imshow("new", dst);
waitKey(0);
return 0;
}
- float alpha = 0.8;
float beta = 20;