使用opencv讀取圖像時圖像的排列方式是一個三維數組,但並非是三維數組按照[r:[[]] g:[[]] b:[[]]] 然後組合的方式存儲。
圖片的存儲方式可以理解成有個長 * 寬 的矩陣 矩陣的每一個點包括[b, g, r]三個點的數據 是按照[b, g, r][b, g, r] 的方式存儲
#include <iostream>
#include <opencv2/opencv.hpp>
#include <math.h>
using namespace std;
using namespace cv;
int main() {
string path = "005.jpg";
Mat srcImage = imread(path);
namedWindow("show", 0);
imshow("show", srcImage);
waitKey(0);
Mat dst;
dst.create(srcImage.size(), srcImage.type());
//遍歷每一個像素
for(int i = 0; i < srcImage.rows; i++){
for(int j = 0; j < srcImage.cols; j++){
/*
* 使用at模板函數來訪問每一行每一列的像素
* 如 img.at<Vec3b>(i, j) 其中[0]爲b [1] g [2] r
* 由此可以看出RGB的排列方式,是一個三維數組 其中第一維是長 第二維是寬,第三維度包含三個點分別是BGR
* */
int b = srcImage.at<Vec3b>(i, j)[0];
int g = srcImage.at<Vec3b>(i, j)[1];
int r = srcImage.at<Vec3b>(i, j)[2];
//打印結果:[b, g, r][b, g, r][b, g, r][b, g, r]
cout << srcImage.at<Vec3b>(i, j) << endl;
dst.at<Vec3b>(i, j)[0] = b;
dst.at<Vec3b>(i, j)[1] = g;
dst.at<Vec3b>(i, j)[2] = r;
}
}
namedWindow("show1", 0);
imshow("show1", dst);
waitKey(0);
return 0;
}