opencv三种遍历像素及两种截取图片方法

1.最简单也是最基本的for循环

for(int i=0;i<img.rows;++i)
    for(int j=0;j<img1.cols;++j)
    {
        Vec3b pelex;
        pelex[0] = 0;
        pelex[1] = 0;
        pelex[2] = 255;
        img1.at<Vec3b>(i, j) = pelex;
    }

at()方法是用于读取或者修改像素点的方法

2.迭代器迭代法

int i=0;
MatIterator<Vec3b> imgit,imgend;  //MatIterator是Mat类型的迭代器
//就是将高维的矩阵转换为一维矩阵,以我的理解就是一个暂存像素的容器
for(imgit=img.begin(),imgend=img.end();imgit<imgend;imgit++)
{
    ++i;
    imgit[0]=i%255;
    imgit[1]=i%255;
    imgit[2]=i%255;
}

3.指针方法遍历像素

for(int i=0;i<img.rows;++i)
{
    uchar *p=img.ptr<uchar>(i); //获取第i行第一个像素的指针
    for(int j=0;j<img.cols;++j)
    {
        p[j][0] = (i) % 255;
        p[j][1] = (j) % 255;
        p[j][2] = (i + j) % 255;
    }

指针方法与上述的for方法区别在于不用再调用at()方法,在处理大量数据的时候速度回大大加快

//截取图像区域方法
1.Range()方法
使用Range()方法可以方便地截取图片上的某一部分
注意使用时不要超出原图片的像素范围

Mat cut=img(Range(50,100),Range(50,100));
//还有一个all()方法
Mat cut1=img(Range::all(),Range(100,200));
//这两种方式都可以从原图上截取对应的图像部分

经过代码实验,截取出来的图像也是指向原图像的内存区域
Mat cut = img1(Range(100, 200), Range::all());
for(int i=100;i<200;++i)
    for (int j = 100; j < 200; ++j)
    {
        Vec3b pilex;
        pilex[0] = 0;
        pilex[1] = 0;
        pilex[2] = 0;
        img1.at<Vec3b>(i, j) = pilex;
    }
imshow("cut",cut);
imshow("img1", img1);

这里写图片描述

2.感兴趣区域Rect()
Rect()的四个参数分别是图像左上点坐标和长宽

Mat temp(img(Rect(10,10,200,200)));
//或
Mat temp1=img(Rect(10,10,100,100));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值