1. Mat 数据存放格式
Mat 和 Matlab 里的数组格式有点像,但一般是二维向量。
- 如果是灰度图,一般存放 <uchar> 类型 (0~255)
- 如果是RGB彩色图,存放 <Vec3b> 类型
单通道灰度图数据存放格式:
多通道的图像中,每列 并列存放通道数量的子列,如RGB三通道彩色图:
注意通道的顺序反转了:BGR。
2. Mat::at 获取图像某点的值
src.at<Vec3b>(i, j) // RGB值
(int) src.at<uchar>(i, j) // 灰度值
// 扫描 RGB 图像矩阵
void scanImageMatrix(Mat &src) {
for (int i = 0; i < src.rows; ++i) {
for (int j = 0; j < src.cols; ++j) {
cout << src.at<Vec3b>(i, j) << ", ";
}
cout << endl;
}
}
// 扫描灰度图像矩阵
void scanImageMatrixG(Mat &src) {
for (int i = 0; i < src.rows; ++i) {
for (int j = 0; j < src.cols; ++j) {
cout << setw(3) << (int) src.at<uchar>(i, j) << ", ";
}
cout << endl;
}
}
选择了 1-5行 5-9列的数据
RGB 图像输出
[103, 105, 129], [102, 104, 128], [102, 104, 128], [100, 102, 126], [99, 103, 127],
[103, 105, 129], [102, 104, 128], [102, 104, 128], [100, 102, 126], [101, 103, 127],
[103, 105, 129], [102, 104, 128], [102, 104, 128], [100, 102, 126], [101, 103, 127],
[105, 105, 129], [104, 104, 128], [102, 104, 128], [100, 102, 126], [100, 102, 126],
[105, 105, 129], [104, 104, 128], [104, 104, 128], [102, 102, 126], [100, 102, 126],
……
灰度图像输出
112, 111, 111, 109, 110,
112, 111, 111, 109, 110,
112, 111, 111, 109, 110,
112, 111, 111, 109, 109,
112, 111, 111, 109, 109,
……
像素点的 灰度值 = ( R + G + B ) / 3
3. 源代码
#include <cv.h>
#include <highgui.h>
#include <iomanip>
using namespace cv;
using namespace std;
// 扫描图像矩阵
void scanImageMatrix(Mat &src) {
for (int i = 0; i < src.rows; ++i) {
for (int j = 0; j < src.cols; ++j) {
cout << src.at<Vec3b>(i, j) << ", ";
}
cout << endl;
}
}
// 扫描灰度图像矩阵
void scanImageMatrixG(Mat &src) {
for (int i = 0; i < src.rows; ++i) {
for (int j = 0; j < src.cols; ++j) {
cout << setw(3) << (int) src.at<uchar>(i, j) << ", ";
}
cout << endl;
}
}
int main() {
Mat src = imread("../pictures/bear.jpeg", 0);
scanImageMatrixG(src);
return 0;
}