获取图像像素指针
CV_Assert(myImage.depth() == CV_8U);
Mat.ptr< uchar >(int i=0) 获取像素矩阵的指针,索引i表示第几行,从0开始计行数。(uchar是一个字节)
- 获得当前行指针const uchar* current= myImage.ptr< uchar >(row);
- 获取当前像素点P(row, col)的像素值 p(row, col) =current[col]
dst(destination):目标图片
src(source):源图像
像素范围处理saturate_cast < uchar >
简单介绍:saturate_cast< uchar >用于像素范围处理:小于0则返回0、大于255则返回255、0-255之间返回原值。
saturate_cast< uchar >(-100),返回 0。
saturate_cast< uchar >(288),返回255。
saturate_cast< uchar >(100),返回100。
这个函数的功能是确保RGB值得范围在0~255之间。
矩阵掩膜操作
作用
1.提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。
2.屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
3.结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
4.特殊形状图像的制作。
引用链接:https://zhuanlan.zhihu.com/mengcius-opencvbase
操作示意
代码实现
#include <opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include<stdlib.h>
using namespace cv;
int main(int argc, char** argv) {
Mat src = imread("C:/Users/admin/Desktop/lenna.png");//读入图片
Mat dst;//提高对比度之后图片的矩阵
if (src.empty()){ // 特判
printf("cannot see\n");
return -1;
}
namedWindow("opencv setup1", CV_WINDOW_AUTOSIZE);
imshow("opencv setup1", src);
int cols = (src.cols - 1) * src.channels(); // 定义列数(因为RGB是3个通道,所以col要乘上通道数)
int offsetx = src.channels(); // 通道数
int rows = src.rows; // 行数
dst = Mat::zeros(src.size(), src.type());
//遍历每一行,第一行和最后一行不用处理
for (int row = 1; row < (rows-1); row++) {
//定义指针分别指向当前行,上一行和下一行的首地址
const uchar* previous = src.ptr<uchar>(row - 1);
const uchar* current = src.ptr<uchar>(row);
const uchar* next = src.ptr<uchar>(row + 1);
//定义目标指针的当前行指向output指针
uchar* output = dst.ptr<uchar>(row);
//遍历每一列,因为RGB是3个通道
for (int col = offsetx; col < cols; col++) {
//掩膜操作的新像素值=某像素值*系数 - 其上下相邻行和左右相邻通道的像素值(RGB是3个通道 )
output[col] = saturate_cast<uchar>(5 * current[col] - (previous[col] + next[col] + current[col - offsetx] + current[col + offsetx]));
}
}
//输出目标图像
namedWindow("opencv setup2", CV_WINDOW_AUTOSIZE);
imshow("opencv setup2", dst);
waitKey(0);
system("pause"); //以便在退出程序前调用系统的暂停命令暂停命令行
}
函数filter2D实现掩膜操作
可直接用opencv的API做掩膜操作来提高对比度。
filter2D( src, dst, src.depth(), kernel ): 其中src与dst是Mat类型变量,src.depth表示位图深度,有32、24、8等,直接写-1表示与输入图深度一致。(filter滤波器)
#include <opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include<stdlib.h>
using namespace cv;
int main(int argc, char** argv) {
Mat src = imread("C:/Users/admin/Desktop/lenna.png");//读入图片
Mat dst;//提高对比度之后的图片矩阵
if (src.empty()){ // 特判
printf("cannot see\n");
return -1;
}
namedWindow("opencv setup1", CV_WINDOW_AUTOSIZE);
imshow("opencv setup1", src);
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//定义掩膜
filter2D(src, dst, src.depth(), kernel);
//输出目标图像
namedWindow("opencv setup2", CV_WINDOW_AUTOSIZE);
imshow("opencv setup2", dst);
waitKey(0);
system("pause"); //以便在退出程序前调用系统的暂停命令暂停命令行
}