C++opencv图像像素的遍历读写

重要知识

在学习图像的像素的读写之前先了解一下以下三点知识
1.char与uchar的区别
char 是有符号的, uchar(unsigned char)是无符号的!
(1)作为字符来表示的话,两者没有什么区别!
(2)作为整数来表示的话,由于char是有符号的,于是数值范围为-128~127
而uchar是无符号的,于是数值范围为0~255,在图像处理中表示像素值范围时用的多!

2.Vec3b可以看作是vector
简单而言就是一个uchar类型的,长度为3的vector向量。
8U 类型的 RGB 彩色图像可以使用 ,3 通道 float 类型的矩阵可以使用
cv::mat的成员函数: .at(int y, int x)可以用来存取图像中对应坐标为(x,y)的元素坐标。
假设提前已知一幅图像img的数据类型为 unsigned char型灰度图(单通道),要对坐标为(14,25)的像素重新赋值为25,则对应操作如下:
srcImage.at(14,25) = 25;

当要操作的图片img是一幅数据类型同样为unsigned char的彩色图片,再次要求将坐标(14,25)的像素赋值为25。这个操作跟上面的就有点区别了,需要对这个像素三个通道的每个对应元素赋值,Opencv中图像三原色在内存中的排列顺序为B-G-R(见下面注释),操作过程如下:

img.at(14,25) [0]= 25;//B
img.at< Vec3b >(14,25) [1]= 25;//G
img.at< Vec3b >(14,25 [2]= 25;//R

3.图像指针
(1)Mat.ptr(int i=0)获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
(2) 获得当前行指针const uchar* current= myImage.ptr(row );
(3) 获取当前像素点P(row, col)的像素值 p(row, col) =current[col]
矩阵的掩膜操作十分简单,根据掩膜来重新计算每个像素的值,掩膜mask也称为kernel

图像像素的遍历

方法一:
for循环遍历,通过多个for循环嵌套遍历

//for循环遍历图像
void pixel_visit_demo1(Mat &image) {
    int w = image.cols;
    int h = image.rows;
    int dims = image.channels();
    for (int row = 0; row < h; row++){
        for (int col = 0; col < w; col++) {
            if (dims == 1) {
                int pv = image.at(row, col);
                image.at(row, col) = 255 - pv;
            }
            if (dims == 3){
                Vec3b bgr = image.at(row,col);
                image.at(row, col)[0] = 255 - bgr[0];
                image.at(row, col)[1] = 255 - bgr[1];
                image.at(row, col)[2] = 255 - bgr[2];
            }
        }
    }
}

C++opencv图像像素的遍历读写_第1张图片

方法二:

//for指针遍历图像(速度更快)
void pixel_visit_demo2(Mat& image) {
    int w = image.cols;
    int h = image.rows;
    int dims = image.channels();
    for (int row = 0; row < h; row++) {
        uchar* current_row = image.ptr(row);    //  Mat.ptr(int i=0)  获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
        for (int col = 0; col < w; col++) {
            if (dims == 1) {
                int pv = *current_row;
                *current_row++ = 255 - pv;
            }
            if (dims == 3) {
                *current_row++ = 255 - *current_row;
                *current_row++ = 255 - *current_row;
                *current_row++ = 255 - *current_row;
            }
        }
    }
}

C++opencv图像像素的遍历读写_第2张图片

你可能感兴趣的:(Opencv(C++),opencv,c++,计算机视觉)