获取图像像素指针
CV_Assert(myImage.depth() == CV_8U);
Mat.ptr(int i=0)获取像素矩阵指针,索引i表示第i行,从0开始计数;
获得当前指针const uchar* current = myImage.ptr(row);
获取当前像素点P(row, col)的像素值p(row, col) = current[col];
像素范围处理saturate_cast
saturate_cast(小于0的数), 返回0;
saturate_cast(大于255的数), 返回255;
saturate_cast(0-255之间的数), 返回输入的值本身;
这个函数的功能是,确保RGB值的范围处于0-255之间;’
提高图像对比度原理
通过计算,使得当前像素=5*当前像素-(左侧像素+右侧像素+上方像素+下方像素);
这样计算的目的是,使得图像中亮的部分更亮,暗的部分更暗,从而增加图像的对比度;
程序实现
1 #include <iostream> 2 #include <opencv2/opencv.hpp> 3 #include <math.h> 4 5 using namespace std; 6 using namespace cv; 7 8 int main() { 9 // 加载一张普通图片 10 Mat src, dst; 11 src = imread("C:\\Users\\Administrator\\Desktop\\background.png"); 12 if (!src.data) { // 判断是否获取到了图片 13 printf("Could not load image!\n"); 14 return -1; 15 } 16 // 将这张普通图片显示出来 17 namedWindow("input image", WINDOW_AUTOSIZE); 18 imshow("input image", src); 19 20 // 这里要用图片和掩膜做卷积操作,所以要把最外面的那一圈像素去掉 21 // 图像宽度 = 每一行像素点个数 X 每个像素点的通道数(如:RGB) 22 // 序号是从0开始的,所以-1后,相当于把第一个和最后一个像素点去掉 23 int cols = (src.cols-1) * src.channels(); 24 int offsetx = src.channels(); 25 // 获取图像高度 26 int rows = src.rows; 27 // 创建一个和载入图片相同大小的空的矩阵 28 dst = Mat::zeros(src.size(), src.type()); 29 30 // 序号是从第0行开始的,这样把第0行略过 31 for (int row = 1; row < (rows - 1); row++) { 32 const uchar* previous = src.ptr<uchar>(row - 1); // 获取上一行指针 33 const uchar* current = src.ptr<uchar>(row); // 获取当前行指针 34 const uchar * next = src.ptr<uchar>(row + 1); // 获取下一行指针 35 // 创建一个行指针指向创建的空矩阵的对应行 36 uchar* output = dst.ptr<uchar>(row); 37 for (int col = offsetx; col < cols; col++) { 38 // 把每个像素的值限定在0-255之间 39 output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col])); 40 } 41 } 42 43 // 显示提高对比度之后的图像 44 namedWindow("contrast image demo", WINDOW_AUTOSIZE); 45 imshow("contrast image demo", dst); 46 47 waitKey(0); // 让程序在这里卡住,不然会一下子退出 48 49 return 0;
运行效果
左侧为原图,右侧为处理后的图像:
函数调用filter2D功能
1、定义掩膜:Mat kernel = (Mat_(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
2、filter2D(src, dst, src.depth(), kernel); 其中src与dst是Mat类型变量、src.depth表示位图深度,有32、24/8等;
程序实现
1 #include <iostream> 2 #include <opencv2/opencv.hpp> 3 #include <math.h> 4 5 using namespace std; 6 using namespace cv; 7 8 int main() { 9 // 加载一张普通图片 10 Mat src, dst; 11 src = imread("C:\\Users\\Administrator\\Desktop\\background.png"); 12 if (!src.data) { // 判断是否获取到了图片 13 printf("Could not load image!\n"); 14 return -1; 15 } 16 // 将这张普通图片显示出来 17 namedWindow("input image", WINDOW_AUTOSIZE); 18 imshow("input image", src); 19 20 // 使用内置的API 21 Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); 22 filter2D(src, dst, src.depth(), kernel); 23 24 // 显示提高对比度之后的图像 25 namedWindow("contrast image demo", WINDOW_AUTOSIZE); 26 imshow("contrast image demo", dst); 27 28 waitKey(0); // 让程序在这里卡住,不然会一下子退出 29 30 return 0; 31 }
通过调用API我们一样达到了同样的图片处理效果。