演示代码:
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace cv; int main(int argc, char** argv) { Mat src, dst; src = imread("e:/5.png"); if (!src.data) { printf("could not load image...\n"); return -1; } imshow("win1", src); //循环像素方式实现亮度对比调节 float alpha = 1.5; float beta = 10; dst = src.clone(); for (int i = 0; i < src.rows; i++) { for (int k = 0; k < src.cols; k++) { int b = dst.at<Vec3b>(i, k)[0]; int g = dst.at<Vec3b>(i, k)[1]; int r = dst.at<Vec3b>(i, k)[2]; dst.at<Vec3b>(i, k)[0] = saturate_cast<uchar>(b * alpha + beta); dst.at<Vec3b>(i, k)[1] = saturate_cast<uchar>(g * alpha + beta); dst.at<Vec3b>(i, k)[2] = saturate_cast<uchar>(r * alpha + beta); } } imshow("win2", dst); //convertTo函数也可以实现亮度对比度 //它比循环像素操作要快得多,不是一个数量级 Mat dst2; src.convertTo(dst2, src.type(), alpha, beta); imshow("win3", dst2); waitKey(0); return 0; }
代码说明:
(1)亮度对比度调节的理论如下:
图像变换可以看作如下:
- 像素变换 – 点操作
- 邻域操作 – 区域
调整图像亮度和对比度属于像素变换-点操作
(2)convertTo可以用来快速进行亮度对比度调节,如代码所示用法。
它比循环像素点操作快得多,两者不是一个数量级。
(3)关于数据类型Vec3b,其实就是表示3通道,uchar类型。
如果要把当前的Vec3b转为Vec3f,可以用convertTo()函数。
src.convertTo(m1,CV_32F)
typedef Vec<uchar, 2> Vec2b; typedef Vec<uchar, 3> Vec3b; typedef Vec<uchar, 4> Vec4b; typedef Vec<short, 2> Vec2s; typedef Vec<short, 3> Vec3s; typedef Vec<short, 4> Vec4s; typedef Vec<ushort, 2> Vec2w; typedef Vec<ushort, 3> Vec3w; typedef Vec<ushort, 4> Vec4w; typedef Vec<int, 2> Vec2i; typedef Vec<int, 3> Vec3i; typedef Vec<int, 4> Vec4i; typedef Vec<int, 6> Vec6i; typedef Vec<int, 8> Vec8i; typedef Vec<float, 2> Vec2f; typedef Vec<float, 3> Vec3f; typedef Vec<float, 4> Vec4f; typedef Vec<float, 6> Vec6f; typedef Vec<double, 2> Vec2d; typedef Vec<double, 3> Vec3d; typedef Vec<double, 4> Vec4d; typedef Vec<double, 6> Vec6d;
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文章代码及资料部分或全部来自贾志刚老师的视频,勇哥只是在个人理解的基础上做学习笔记,转载请附上博文链接!
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:


