一、Mat类的综述
1. Mat 类存储图像
Mat 类是 OpenCV 里面使用广泛的一个类,最重要的一个作用就是作为存储图像的数据结构。Mat类是如何存储图像的呢?图像分为彩色图像和灰度图像,不管是彩色图像还是灰度图像,都是二维的矩阵,具体的存储格式如下:
(1)灰度图像的格式:
(2)彩色图像的格式:
虽然彩色图像由BGR三个通道,但是是存储在同一个平面内的,只不过OpenCV在这里把三列才当作一列,因此有 img.cols 等于图像的列数。
一般我们用 OpenCV 读取的灰度图像的数据类型为 uchar 类型的,而彩色图像的一个像素的数据类型为 <Vec3b> 类型,灰度图一个像素占用一个字节,而彩色图像一个像素3个字节。接下来简单介绍如何按像素读取图像。
2. Mat 按像素读取图像内容
这里主要介绍两种方法:一种非常简单,易于编程,但效率比较低;另一种效率高,但不好记。
(1)易于编程的方法
#include <opencv2\core\core.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("1.jpg");
resize(img, img, Size(375, 500));//resize为500*375的图像
cvtColor(img, img, CV_RGB2GRAY);//转为灰度图
imshow("gray_ori", img);
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
//at<类型>(i,j)进行操作,对于灰度图
img.at<uchar>(i, j) = i+j;
}
}
imshow("gray_result", img);
waitKey(0);
return 0;
}
效果图: