本文共 3168 字,大约阅读时间需要 10 分钟。
图像变换可以看作如下:
void changeContrast(Mat &src, Mat &dst,float alpha, float beta);
参数1:输入需要调整的图像 参数2:输出对比度和亮度调整后的图像 参数3:输入浮点型的数值alpha,用来调节对比度 参数4:输入浮点型的数值beta,用来调节亮度#include#include using namespace std;using namespace cv;void changeContrast(Mat &src, Mat &dst,float alpha, float beta);//输入src;输出dst;alpha用来调节对比度;beta用来调节亮度int main(){ Mat src = imread("1.jpg",IMREAD_UNCHANGED);//读取原始图像,此处的图像是三通道彩色rgb图像 if (!src.data){ cout << "could not load image ..." << endl; getchar();//此处若使用waitKey(0);不能实现暂停状态 return -1; } imshow("src image", src);//展示原始图像 //调整rgb图像的对比度和亮度 Mat dst_rgb;//定义一个输出图像,下面调用函数时使用 changeContrast(src, dst_rgb, 1.2, 10); imshow("dst_rgb image", dst_rgb);//展示调整对比度和亮度后的rgb图像 //imwrite("dst_rgb.jpg", dst); //将上面的rgb转换成灰度图像 Mat gray; cvtColor(src, gray, COLOR_BGR2GRAY);//此处用来将三通道彩色rgb图像转换成单通道灰度图像 imshow("gray image", gray);//展示灰度化后的图像 //imwrite("gray.jpg", gray); //调整gray图像的对比度和亮度 Mat dst_gray;//定义一个输出图像,下面调用函数时使用 changeContrast(gray, dst_gray, 1.2, 10); imshow("dst_gray image", dst_gray);//展示调整对比度和亮度后的rgb图像 //imwrite("dst_gray.jpg", dst2); waitKey(0);//此处不能使用getchar来暂停,否则会导致图片无法显示 return 0;}void changeContrast(Mat &src, Mat &dst, float alpha, float beta){ //定义alpha用来调节对比度,beta用来调节亮度 dst = Mat::zeros(src.size(), src.type());//创建一个背景图像dst,与原始图像src类型相同 Mat m1; src.convertTo(m1, CV_32F);//convertTo用来改变图像的位深度,此处将src的中的数据类型变为float类型,为了后面使用Vec3f来读取其中的像素值,否则用Vec3f读取uchar类型的数据会报错 for (int row = 0; row < src.rows; row++){ for (int col = 0; col < src.cols; col++){ if (src.channels() == 1){ //判断如果图像是单通道的(单通道和三通道读取像素不同) float v = src.at (row, col); dst.at (row, col) = saturate_cast (alpha*v + beta);//saturate_cast将里面的值保持在0~255之间 } else if (src.channels() == 3){ //判断如果图像是三通道的 float b = m1.at (row, col)[0]; //此处使用at 进行像素读取操作时,图像的像素值的类型必须为float型的,否则类型不匹配无法读取。 float g = m1.at (row, col)[1]; //一般读取的数据类型是8位无符号整型的数值,使用at 即可读取(前面的convertTo便可直接去掉) float r = m1.at (row, col)[2]; dst.at (row, col)[0] = saturate_cast (alpha*b + beta);//此处就是针对像素点的值的操作,对应数学理论g(i,j) = a*f(i,j) + b; dst.at (row, col)[1] = saturate_cast (alpha*g + beta);//saturate_cast (value)确保值大小范围为0~255之间 dst.at (row, col)[2] = saturate_cast (alpha*r + beta); } } }}
转载地址:http://vzozi.baihongyu.com/