初出茅庐之OpenCV,图像数据cv::Mat.at和cv::MaT.ptr对单个像素的访问和操作

在学习OpenCV进行图像处理的过程中,常常会用到对指定位置像素的读取和修改,

最常用的就是cv::MAT.at<>()和cv::MAT.ptr<>(),下面我们就介绍OpenCV中这两种常用的对指定位置像素值的读取和修改操作。

一、at操作

at操作是一种直接简单的对单个像素的操作方式,用于获取图像矩阵某点的值或改变某点的值

对于灰度图读取和修改操作如下:
          uchar srcPixel_value = cv::Mat.at<uchar>(row, col);
          cv::Mat.at<uchar>(row, col) = srcPixel_value ; 


对于RGB彩色图像而言:

          cv::Vec3b rgb_value = cv::Mat.at<cv::Vec3b>(row, col);
          cv::Mat.at<cv::Vec3b>(row, col) = rgb_value ;

或者:

           image.at<cv::Vec3b>(row, col)[0] =  255;

           image.at<cv::Vec3b>(row, col)[1] =  255;

           image.at<cv::Vec3b>(row, col)[2] = 255;

例子:

  cv::Mat  image(3,10,CV_32FC3);
  int div = 4;
     for(int i=0; i<image.rows;i++)
     {
        for(int j=0; j<image.cols; j++)
        {
          image.at<Vec3f>(i,j)[0]=image.at<Vec3f>(i.j)[0] / div;
          image.at<Vec3f>(i,j)[1]=image.at<Vec3f>(i.j)[1] / div;
          image.at<Vec3f>(i,j)[2]=image.at<Vec3f>(i.j)[2] / div;
        }
     };

at操作虽然简单方便,但是这种操作是一种效率比较低的操作,尤其用其进行遍历操作时,效率会很低。因此一般不推荐使用。

 

二、ptr操作:

ptr操作时通过指针偏移的方式进行像素的查找、遍历和修改的,因此效率相对较高。

ptr<>()是按照行来访问数组的,指针指向某一行第一个元素的首地址。只要知道这一行的首地址,其余地址++就可以访问了。
对于灰度图的读取和修改操作如下:

uchar srcPixel_value = cv::Mat.ptr<uchar>(row)[col];
cv::Mat.ptr<uchar>(row)[col] = srcPixel_value ; 

对于RGB彩色图像而言:

cv::Vec3b rgb_value = Mat.ptr<cv::Vec3b>(row)[col];
cv::Mat.ptr<cv::Vec3b>(row)[col] = rgb_value ;

例子:

cv::Mat image (3,10,float);
int div = 4;
cv::Mat newimage(image.size(), image.type());
for(int i=0; i<image.rows; i++)
  {
      uchar *data=image.ptr<uchar>(i);
      uchar *outdata=newimage.ptr<uchar>(i);
     for(int j=0; j<image.cols; j++)
     {
       outdata[ j ]= data[ j ] /div;
     }
  };

cv::MAT.ptr<>()访问效率比较高,程序也比较安全,有越界判断。推荐使用。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值