图像的遍历

本文介绍了两种遍历图像的方法:使用at方法和指针。at方法适用于获取灰度图像的像素值或彩色图像特定通道的颜色。指针方法则更加高效,通过获取图像行指针并直接访问像素值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、遍历图像的4种方式:at<typename>(i,j)

通过上面的例子我们可以看出,at方法取图像中的点的用法:

image.at<uchar>(i,j):取出灰度图像中i行j列的点。

image.at<Vec3b>(i,j)[k]:取出彩色图像中i行j列第k通道的颜色点。其中uchar,Vec3b都是图像像素值的类型,不要对Vec3b这种类型感觉害怕,其实在core里它是通过typedef Vec<T,N>来定义的,N代表元素的个数,T代表类型。

2、高效一点:用指针来遍历图像

从上面的例子中可以看出,取出图像中第i行数据的指针:image.ptr<uchar>(i)。

值得说明的是:程序中将三通道的数据转换为1通道,在建立在每一行数据元素之间在内存里是连续存储的,每个像素三通道像素按顺序存储。也就是一幅图像数据最开始的三个值,是最左上角的那像素的三个通道的值。

 

 

image.at<uchar>(i,j)=image.data+i*image.step+j*image.elemSize();

我觉得应该是image.ptr<uchar>(i,j)=image.data+i*image.step+j*image.elemSize();

因为image.ptr<uchar>(i,j)取到的是指针,而image.at<uchar>(i,j)计算的是像素值。

 

提醒的是,image.at<uchar>(i,j)应该取地址。但是image.ptr<uchar>(i,j)这种写法是不对的,因为ptr这个方法是返回图像某一行的指针。文档里是这样描述的:Returns a pointer to the specified matrix row

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值