美文网首页CV
图像容器 & 遍历 Mat 矩阵

图像容器 & 遍历 Mat 矩阵

作者: 谢小帅 | 来源:发表于2017-07-12 17:13 被阅读21次

    1. Mat 数据存放格式

    Mat 和 Matlab 里的数组格式有点像,但一般是二维向量。

    • 如果是灰度图,一般存放 <uchar> 类型 (0~255)
    • 如果是RGB彩色图,存放 <Vec3b> 类型

    单通道灰度图数据存放格式:

    单通道灰度图数据存放格式

    多通道的图像中,每列 并列存放通道数量的子列,如RGB三通道彩色图:

    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;
    }
    

    相关文章

      网友评论

        本文标题:图像容器 & 遍历 Mat 矩阵

        本文链接:https://www.haomeiwen.com/subject/rzwbhxtx.html