在OpenCV中,图像的像素值是以一个多维数组的形式表示的。上一篇已经介绍了cv::Mat类。对于图像中的每一个像素,可以通过Mat对象中的at
- cv::Vec3b pixel = image.at
(y, x); // 获取指定像素处的像素值 - unsigned char r = pixel[2]; // 获取红色通道的像素值
image.at(y, x) = cv::Vec3b(255, 0, 0); // 设置指定像素处的像素值为蓝色
对于一幅图片,如果想要对其中的一些像素点进行计算,一般通过Mat矩阵的二维循环逐一改变像素值。例如:
- Mat image = imread("test.jpg");
- int rows = image.rows;
- int cols = image.cols;
- for (int i = 0; i < rows; i++)
- {
- for (int j = 0; j < cols; j++)
- {
- Vec3b& color = image.at
(i, j); - color[0] = 255 - color[0]; // 修改 B 像素值
- color[1] = 255 - color[1]; // 修改 G 像素值
- color[2] = 255 - color[2]; // 修改 R 像素值
- }
- }
- imshow("image", image);
- waitKey();
这段代码演示了如何遍历图像的每个像素并反转BGR通道的值,然后显示处理后的图像。
其实很多图像变换再OpenCV中已经封装了相应的功能函数,不需要开发者进行像素级的操作,下面列举几个常用的OpenCV图像变换和像素运算,后续有机会还会专门讲解图像变换。
通过对图像进行阈值化操作,可以将像素值转换为二进制形式,用于图像分割、目标检测等应用。cv::threshold()
是一个常用的函数,它将图像像素值与设定的阈值比较,根据条件将像素值设为给定的最大值或最小值。
- cv::Mat grayImage;
- cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY); // 将彩色图像转为灰度图像
- cv::Mat thresholdImage;
- cv::threshold(grayImage, thresholdImage, 128, 255, cv::THRESH_BINARY); // 将灰度图像进行二值化处理
可以对两个图像进行像素级的算术运算,如加法、减法、乘法或除法。函数cv::add()、cv::subtract()、cv::multiply()、cv::divide()
等常用于图像的像素级算术运算。
- cv::Mat image1 = cv::imread("image1.jpg");
- cv::Mat image2 = cv::imread("image2.jpg");
- cv::Mat result;
- cv::add(image1, image2, result); // 图像相加
- cv::Mat diff;
- cv::subtract(image1, image2, diff); // 图像相减
这些是OpenCV中常见的像素级相关操作和计算的示例,包括像素值的读取和修改、图像阈值化、像素算术运算等。通过对图像的每个像素进行操作和计算,我们可以实现丰富的图像处理和分析功能。
上述代码中还用到了图像读取的函数imread()。这个函数是OpenCV中图像加载的方法。除此之外还有一些常用的图像操作的方法,举例如下:
cv::imread()函数可以读取多种图像格式的文件,例如JPEG、PNG等,cv::imwrite()函数可以将图像保存到磁盘上。例如:
- Mat image = imread("test.jpg");
- imwrite("output.jpg", image);
OpenCV中提供了一些基本的图像处理函数,例如resize()(调整图像大小)、reshape()(调整通道数)、copyTo()(复制图像)等。例如:
- Mat image = imread("test.jpg");
- Mat resizedImage;
- resize(image, resizedImage, Size(128, 128));
- imshow("image", resizedImage);
- waitKey();
这段代码演示了如何将图像缩小并显示缩小后的图像。