OpenCV(c++) 笔记一 :图像的读取与保存、修改、Mat常用函数、掩膜

理解并不是很深刻的笔记,做给自己看的。记录常用的API,一些常用的函数和方法来便于回忆与复习。本笔记内容均来自B站视频教学,需要一定的C(C++)语言基础。

图像处理的本质是对图像上的每个像素点进行相应的数学处理,以此达到预期的效果。

图像的读取和显示、保存

	Mat src = imread("地址",IMREAD_COLOR);
	if (src.empty()) {
		printf("counld not read image");
		return -1;
	}
	namedWindow("test opencv setup", CV_WINDOW_AUTOSIZE);
	imshow("test opencv setup", src);
  1. Mat是图像类,src为该类的一个对象
  2. imread即为读取图像的函数,在双引号中输入地址,以不同的方式读入图片
  3. 利用empty()函数对图片进行判断,如果为空则输出信息并停止运行
  4. namedWindow即为创建窗口的函数,其中双引号内为该窗口的名字,后面的参数也有各种方法,图示为窗口大小随图片自动适应
  5. imshow即为在刚才创建的窗口上显示图片,双引号内为窗口名,后面为图片名
	namedWindow("changed", CV_WINDOW_AUTOSIZE);
	Mat output_image;
	cvtColor(src, output_image, CV_BGR2GRAY);
	imshow("changed", output_image);
	imwrite("D:/hltest.png", output_image);

在此我创建了一个名为changed的窗口和新的mat对象,并使用cvtColor(待转变图片,转变后图片,转变方式)将其变为了灰度图像并显示在窗口上,并用imwrite函数将改变后的图片写入了相应的位置处。cvtColor函数的转变方式还有很多,以后再慢慢探索。


Mat对象和常用的几个函数

Mat对象OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。

	Mat dst;
	
	dst = Mat(src.size(), src.type());
	dst = Scalar(0, 0, 255);
	
	src.copyTo(dst);
	src.clone(dst);
	
	cvtColor(src, dst, CV_BGR2GRAY);
	cout<<"cannels initial = "<<src.channels()<<endl;
	cout << "cannels gray = " << dst.channels() << endl;
	
	
	imshow("output", dst);
  1. 创建了一个Mat对象用于保存修改后的图像,src是原图像
  2. 第二行语句为创建一个与src大小相同,类型相同的图像
  3. Scalar方法对该新建图像进行填充颜色,本例即为一个同样大小的红色图片
  4. copyTo函数将原图像进行复制
  5. 转为灰度图像后利用channels函数输出图片的通道数
	Mat gray_src;
	cvtColor(src1, gray_src, CV_BGR2GRAY);//将图像转为灰度图
	imshow("output", gray_src);
	int height = gray_src.rows;//获得图像的高度
	int width = gray_src.cols;//获得图像的宽度
	
	Mat dstt;
	dstt.create(src1.size(), src1.type());
	height = src1.rows;
	width = src1.cols;
	int nc = src1.channels();
	
	for (int row = 0; row < height; row++) {
		for (int col = 0; col < width; col++) {
			if (nc == 1) {	//如果通道数为1
				int gray = gray_src.at<uchar>(row, col);
				gray_src.at<uchar>(row, col) = 255 - gray;
			}
			else if (nc == 3) {	//如果通道数为3,则每个点都要进行修改
				int b = src1.at<Vec3b>(row, col)[0];
				int g = src1.at<Vec3b>(row, col)[1];
				int r = src1.at<Vec3b>(row, col)[2];
				dstt.at<Vec3b>(row, col)[0] = 255 - b;
				dstt.at<Vec3b>(row, col)[1] = 255 - g;
				dstt.at<Vec3b>(row, col)[2] = 255 - r;
			}

		}
	}

一个综合运用修改图片的例子
其实以上代码仅用 bitwise_not(src, dst); 即可完成,该函数的意思是按位取反,与我们对每个像素点单独操作是类似的意思。


简单的掩膜

掩膜的意思差不多是以一片区域作为单位进行像素点的处理,通过一定的算法来修改某个点的像素值。比如以一个九宫格作为算子,中间点的像素值需要由周围的点来进行计算后确定,这样的操作可以看作是一个简单的掩膜操作。

	Mat dst;
	Mat karnel = (Mat_<char>(3, 3) << 0, -2, 0, -2, 10, -1, 0, -1, 0);
	filter2D(src, dst, src.depth(), karnel);//depth是深度,可以直接写为-1

这便是掩膜的简单定义和使用
其中(3,3)代表一个3x3的矩阵,从上到下,从左到右的系数分别是0, -2, 0, -2, 10, -1, 0, -1, 0,即以九宫格中心为基准,每个中心点的像素都是由周围的8个点乘以对应的系数得来。最后利用filter2D函数,将处理后的图像赋给dst图像。

发布了14 篇原创文章 · 获赞 11 · 访问量 2537

猜你喜欢

转载自blog.csdn.net/qq_43425914/article/details/97308427