第四节 图像的读写操作

知识点

c++中的像素遍历与访问

-数组遍历

-指针方式便利


数组遍历

void QUickdemo::pixel_visit_demo(Mat& image)


{
    int kuan = image.cols;
    int gao = image.rows;
    int tongdaoshu = image.channels();
    for (int row = 0; row < gao; row++) {--遍历图像的宽和高
        for (int cot = 0; cot < kuan; cot++) {
            if (tongdaoshu == 1) {                      //灰度图像
                int pv = image.at<uchar>(row,cot);//获取当前像素,像素点每个像素值是字节类型就是uchar转换为int类型
                image.at<uchar>(row, cot) = 255 - pv;
            
            }
            if (tongdaoshu == 3) {                       //彩色图像
            

                Vec3b BGR=image.at<Vec3b>(row, cot);//三个通道若为int型则是Vec3i 浮点型是vec3f,b是uchar类型
                
                image.at<Vec3b>(row, cot)[0] = 255 - BGR[0];
                image.at<Vec3b>(row, cot)[0] = 255 - BGR[1];
                image.at<Vec3b>(row, cot)[0] = 255 - BGR[2];
            
            
            }

        }
        }
    namedWindow("像素演示", WINDOW_FREERATIO);
    imshow("像素演示", image);
    }


指针遍历

代码

void QUickdemo::pixel_visit_demo(Mat& image)
{
    int kuan = image.cols;
    int gao = image.rows;
    int tongdaoshu = image.channels();
    for (int row = 0; row < gao; row++)
    {
        uchar* current_row = image.ptr<uchar>(row);
        for (int cot = 0; cot < kuan; cot++) {
            if (tongdaoshu == 1) {
                //灰度图像
                //int pv = image.at<uchar>(row, cot);//获取当前像素,像素点每个像素值是字节类型就是uchar转换为int类型
                    int pv = *current_row;
                     *current_row++= 255 - pv;//current_row所指的位置取出一个值,取反,之后将结果存回该位置,并将指针移动到下一位置

            }
            if (tongdaoshu == 3) {                       //彩色图像

                Vec3b BGR = image.at<Vec3b>(row, cot);//三个通道若为int型则是Vec3i 浮点型是vec3f,b是uchar类型

                *current_row++ = 255 - *current_row;
                *current_row++ = 255 - *current_row;
                *current_row++ = 255 - *current_row;


            }

个人理解,若有不对,请多指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值