opencv4 学习 04 对比度增强方法
本章实现两种对比度增加方法
1. 线性方法:x = αx + β
α变量控制对比度,β变量控制亮度
例如原始图片像素范围为[1, 10];当α=2时,像素范围变为[2,20],像素值的分布范围明显增大,对比度变强。
2. 非线性方法:x = (x / 255)gamma * 255
当gamma<1时,增强图像的整体亮度,会对低亮度的像素有明显的增强效果;
当gamma>1时,降低图像的整体亮度,会对高亮度的像素有明显的降低效果;
#include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream> using std::cin; using std::cout; using std::endl; using namespace cv; int main(int argc, char* argv[]) { Mat image = imread("lena.jpg"); Mat new_image = Mat::zeros(image.size(), image.type()); // linear method double alpha = 2.2; // contrast control int beta = 50; // brightness control for(int y=0; y<image.rows; y++){ for(int x=0; x<image.cols; x++){ for(int c=0; c<image.channels(); c++){ new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>(alpha*image.at<Vec3b>(y,x)[c] + beta); } } } imshow("original image", image); imshow("new image", new_image); // non linear method double gamma=0.4; Mat lookUpTable(1, 256, CV_8U); uchar* p = lookUpTable.ptr(); for(int i=0; i<256; ++i) p[i] = saturate_cast<uchar>(pow(i/255.0, gamma)*255.0); Mat res = image.clone(); LUT(image, lookUpTable, res); imshow("gamma correction", res); waitKey(); return 0; }
参考链接:
https://docs.opencv.org/3.4/d3/dc1/tutorial_basic_linear_transform.html