理解并不是很深刻的笔记,做给自己看的。记录常用的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);
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对象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);
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图像。