1.获得像素指针
2.掩码操作 – 实现提高图像对比度
具体代码实现:
Mat src, dst;
src = imread("C:/Users/18929/Desktop/博客项目/项目图片/01.jpg");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
namedWindow("input_image", CV_WINDOW_AUTOSIZE);
imshow("input_image", src);
//掩膜操作--锐化图片,让图片更加清晰
int cols = (src.cols - 1) * src.channels();//对图像列的特殊处理,获取图像列的总数
int offsetx = src.channels();//相当于图像处理时的一列
int rows = src.rows;
//掩码操作公式:I(i,j) = 5*I(i,j)-[I(i-1,j)+I(i+1,j)+I(i,j-1)+I(i,j+1)]
dst = Mat::zeros(src.size(), src.type());//返回指定大小的0数组,相当于创建一张黑色图片,所有通道为0
for (int row = 1; row < (rows - 1); row++) {//因为掩码操作是9宫格处理,所以第一个九宫格中心为(1,1)
const uchar* previous = src.ptr<uchar>(row - 1);//获取上一行的指针
const uchar* current = src.ptr<uchar>(row);//获取当前行指针
const uchar* next = src.ptr<uchar>(row + 1);//下一行像素指针
uchar* output = dst.ptr<uchar>(row);//创建一个输出数组接受结果
for (int col = offsetx; col < cols; col++) {
output[col] = saturate_cast<uchar>(5 * current[col] - current[col - offsetx] - current[col + offsetx] - previous[col] - next[col]);//获取处理结果的像素值,saturate_cast--确保像素处理结果值在0-255
}
}
namedWindow("result_image", CV_WINDOW_AUTOSIZE);
imshow("result_image", dst);
waitKey(0);//设置退出指令为0
return 0;
处理结果:
以上主要是讲述了掩膜操作的原理和具体实现,当然,也可以用filter2D直接实现,前方高能!
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//定义一个3*3,的掩码
filter2D(src, dst, src.depth(), kernel);
只需要以上两行代码,即可完成上面的掩膜操作功能!!!
3.小知识–获取自己程序运行时间
double t = getTickCount();
/*
中间想要测试时间的代码块
*/
double timeconsume = (getTickCount()-t)/getTickFrequency();
printf("run time %.2f",timeconsume);
4.Mat对象
//---------常用构造方法-------
Mat M(3, 3, CV_8UC3, Scalar(0, 0, 255));//定义一个3*3的红色小图像
Mat m1;//create方式创建
m1.create(src.size(), src.type());
m1 = Scalar(0, 0, 255);
dst = Mat::zeros(src.size(), src.type());//返回指定大小的0数组,相当于创建一张黑色图片,所有通道为0
//定义一个小矩阵
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
常用方法:
//------------常用方法-------------
Mat dst;
dst = Mat(src.size(), src.type());//初始化一个mat对象,并赋值给dst
dst = Scalar(127, 0, 255);//给dst对象赋值-RGB
Mat colone = src.clone();//克隆src赋值给colone对象
src.copyTo(colone);//和clone一样,直接复制到括号对象中
src.channels();//获取src的通道数,彩色--3通道,灰度--1通道
waitKey(0);//设置退出指令为0
return 0;
int cols = dst.cols;//获取列数
int rows = dst.rows;//获取行数
const uchar* firstRow = dst.ptr<uchar>(0);//获取首像素地址
printf("%d %d %d\n", cols, rows, *firstRow);