演示代码:
C++
#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)
C++
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,转载请注明出处!讨论可扫码加群:


