openCV学习笔记(二)-- Mat对象和基本使用(掩膜操作)

1.获得像素指针

openCV学习笔记(二)-- Mat对象和基本使用(掩膜操作)_第1张图片

saturate_cast函数:
openCV学习笔记(二)-- Mat对象和基本使用(掩膜操作)_第2张图片

2.掩码操作 – 实现提高图像对比度

原理:openCV学习笔记(二)-- Mat对象和基本使用(掩膜操作)_第3张图片

具体代码实现:

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对象

常用构造和方法
openCV学习笔记(二)-- Mat对象和基本使用(掩膜操作)_第4张图片

对象的创建:
openCV学习笔记(二)-- Mat对象和基本使用(掩膜操作)_第5张图片

//---------常用构造方法-------
	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);

其他注意事项和特性:
openCV学习笔记(二)-- Mat对象和基本使用(掩膜操作)_第6张图片

你可能感兴趣的:(openCV)