1、访问图像像素
1)灰度图像
2)彩色图像
OpenCV中的颜色顺序是BGR而不是RGB。
访问图像的像素在OpenCV中就是访问Mat矩阵,常用的有三种方法。
- at定位符访问
Mat数据结构,操作灰度图像像素点:
int gray_value = (int) image.at<uchar>(i , j) ;
操作彩色图像像素点:
int color_value = (int) image.at<Vec3b>(i , j) [k];
- 指针访问
for (int i = 0; i < mat.rows; i++) { uchar* row = mat.ptr<uchar>(i); // 行指针 for (int j = 0; j < mat.cols; j++) // 遍历每一行 { row[j] = (uchar)((j / 5) * 10); } }
- 迭代器iterator访问
Mat_<Vec3b>::iterator it = M.begin<Vec3b>();//初始位置的迭代器 Mat_<Vec3b>::iterator itend = M.end<Vec3b>();//终止位置的迭代器 for (; it != itend; it++) { //处理BGR三个通道 (*it)[0] = 182;//B (*it)[1] = 194;//G (*it)[2] = 154;//R }
2、图像亮度、对比度调节
图像亮度调节可以等效为图像的像素操作。如下面公式是一个线性的亮度调节。
g(x)=a*f(x) + b
其中:
g(x):处理后的图像
f(x):输入图像
a:增益(放大倍数),用来控制图像的对比度
b:偏置,用控制图像的亮度
Mat M = imread("D:/WORK/5.OpenCV/LeanOpenCV/pic_src/pic4.bmp", IMREAD_GRAYSCALE); Mat M2 = Mat(M.rows, M.cols, CV_8UC1); cout << M.channels() << endl; cout << M.rows<<","<<M.cols << endl; float a = 0.5