OpenCV访问Mat容器类的像素单元

1、利用.at函数来访问Mat容器的像素单元
  1. image.at<uchar>(i, j)  
(1)这就访问到了unsigned char型的二维矩阵image的第i行第j列的元素。这种情况可以直接应用在灰度图像素的访问上。因为灰度图是单通道的,每个元素位置可以单独表征的一个像素元素的像素值。
(2)对于RGB图像来说,有三个通道(OpenCV中三通道的排列方式是BGR),则用 <Vec3b>代替<uchar>就可以了。它的含义是,将RGB图看做是三个二维矩阵按页数排列起来。即将RGB图看作是一个x行y列3页的三维矩阵,其中的3页分别按0、1、2的序号顺序存着B、G、R分量对应的数值,对于RGB图像上的(i,j)位置元素的像素值,是3页上相应位置的分量值按一定加权系数的方式相加得到的结果。
因此访问RGB图像的像素单元就要分别访问三个分分量,方式如下:
  1. image.at<Vec3b>(i,j) [0] //> B    
  2. image.at<Vec3b>(i,j) [1] //> G    
  3. image.at<Vec3b>(i,j) [2] //> R    
(3)对于任意D维度的Mat容器,访问任意元素也是可以用.at函数来实现的。
  1. mat.at<style>(i, j, k...n) //> n为矩阵第i行第j列第k页...第n维的元素  
当然,在D=3的时候可以认为访问的就是RGB图像。

2、step类对象和size类对象
(1)对于大小为row行col列的二维图像来说,size类对象的成员变量size.p[0]=row,size.p[1]=col;step类对象的成员变量step.p[0]=size.p[0]*sizeof(unsigned char), step.p[1]=sizeof(unsigned char)。既size内存放的是图像每个维度的元素数量,step存放的是每个维度占据的内存空间大小。对于非图像的其他二位Mat容器对象,也有类似的定义,只不过需要注意sizeof(style)的类型就可以了。
(2)对于int类型的三维矩阵cube(row,col,page)来说,我们把他理解为二维水平面x、y在竖直深度方向z的堆叠。因此size.p[0]=row、size.p[1]=col、size.p[2]=page分别代表x、y、z方向的元素数目。step.p[0]=row*clo*sizeof(int)、step.p[1]=row*sizeof(int)、step.p[2]=sizeof(int)。比如想要访问三维矩阵cube的第(i,j,k)个元素,则可以通过cube.at<int>(i, j, k)来达到访问这个元素的目的。但是如果想访问这个元素所占的内存单元(就像C风格指针操作那样),则需要point = k*step.p[0] + i*step.p[1] + j*step.p[2]。
(3)对于大于三维的Mat容器对象,接口函数.at则不能继续工作了,通过.at访问像素的功能仅支持3维及以下的数据形式,对于大于三维的数据,只能通过上面介绍的访问内存的方式来进行读写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值