C++ opencv 图像像素的读写操作

1.获取某个像素和其遍历方式


应用API:    我们获取/改变图像的某个像素  Mat::at< >( ) 

image.at(row, col);
/*
获取指定位置的像素值

这里只是at方法的一种演示,一共6种传参方式,具体可查看文档
说明:
    at<>中必须标明矩阵的数据类型,一般图像是uchar(8位无符号整型)类型
    这里我们采用二维度坐标的方式传参
*/

2.图像像素的数组遍历(进行一个反色处理)

  • 直接遍历

//函数定义
void pixel_visit_demo(Mat& image);

//函数实现
void QuickDemo::pixel_visit_demo(Mat& image) {

    int h = image.rows;
    int w = image.cols;
    int dims = image.channels();
    /*
        灰度图像——通道为1
        彩色图像——通道为3
    */
    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];
            }
        }
    }
    imshow("像素读写演示", image);
}

不同通道便利处理方法

对于单通道图像的使用方法:

int pv = image.at(row, col);image.at(row, col) = 255 - pv;//对访问的像素进行反色

对于RGB三通道图像的使用方法:

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];//对访问的像素进行反色

说明:

这里我们解释一下Vec3b是什么

Vec3b可以看作是vector
简单而言就是一个uchar类型的,长度为3的vector向量。

根据通道数的不同,数据类型的不同,就有了很多变化,下面是常用的三种

8U 类型的 RGB 彩色图像可以使用 < Vec3b >
3 通道 float 类型的矩阵可以使用 < Vec3f >
3 通道 int 类型的矩阵可以使用 < Vec3i >
 

  • 图像像素的指针遍历

通过设置每一行的首地址指针,我们可以实现更快的遍历

for(int row = 0; row < h; row++) {

        uchar* curren_row = image.ptr(row);
        //相当于每次获取行的首地址
        for (int col = 0; col < w; col++) {
            
            //灰度图像
            if (dims == 1) {
                *curren_row++ = 255 - *curren_row;
            }
            //彩色图像
            if (dims == 3) {
                *curren_row++ = 255 - *curren_row;
                *curren_row++ = 255 - *curren_row;
                *curren_row++ = 255 - *curren_row;
            }
        }
    }


取完每行的首地址之后

对于单通道图像的使用方法:

*curren_row++ = 255 - pv;

对于RGB三通道图像的使用方法:

//与数组遍历相比,3通道时执行三次就可以
*curren_row++ = 255 - *curren_row;
*curren_row++ = 255 - *curren_row;
*curren_row++ = 255 - *curren_row;


 

 

你可能感兴趣的:(C++,opencv,python,开发语言)