学习记录:三种C++实现读取像素点的方式

1.Mat类简介

Mat类有两个数据部分:矩阵头(包含矩阵的大小,存储方法和存储地址)以及指向存储像素地址的指针。矩阵头的信息是常量,储存像素的地址会随着像素的大小而改变。

2.Mat的存储方式

图像Mat数据在电脑上的存储方式是按照以下方式存储的。

|      row0       |      row1       |         row2    |
—------------------------------------------------------
| col0| col1| col2| col0| col1| col2| col0| col1| col2|
-------------------------------------------------------
|B|G|R|B|G|R|B|G|R|B|G|R|B|G|R|B|G|R|B|G|R|B|G|R|B|G|R|
|Pix0 |Pix1 |Pix2 |Pix3 |Pix4 |Pix5 |Pix6 |Pix7 |Pix8 |

3.指向地址的三种方式

  1.指针方式,使用.ptr<uchar>(i,j)。

Mat image;

int cols = image.cols;
int rows = image.rows;

for (int i=0; i <rows, i++){
    for (int j=0; j<cols, j++){
    image_ele = image.ptr<uchar>(i,j);
    }
}


//或者利用存储像素的指针首地址

Mat image;

int cols = image.cols;
int rows = image.rows;

for (int i=0; i <rows, i++){
    uchar* curren_row = image.ptr<uchar>(i);
    for (int j=0; j<cols, j++){
        *current_now++ = 255 - current_row;
    }
}

2.动态地址方式,使用.at<uchr>(i,j)。

Mat image;

int cols = image.cols;
int rows = image.rows;

for (int i=0; i <rows, i++){
    for (int j=0; j<cols, j++){
    image_ele = image.at<uchar>(i, j);
    }
}


//对于灰度图,要使用image.at<uchar>(i, j)像素值。
//对于三色图,要使用NewImage.at<cv::Vec3b>(j, i)[k]取出单个像素的

3.迭代器方式,iterator

Mat_<Vec 3b>::iterator itbegin = image.begin<Vec 3b>();
Mat_<Vec 3b>::iterator itend = image.end<Vec 3b>();
for (; itbegin != itend; itbegin++){
    int ele_b = *itbegin[0];
    int ele_g = *itbegin[1];
    int ele_r = *itbegin[2];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值