Opencv图像的遍历_at_ptr

opencv_at_ptr 图像的遍历
http://www.cnblogs.com/ronny/p/opencv_road_2.html
1、at(i,j)
对图像降色彩,因为256*256*256实在太多了,在图像颜色聚类或彩色直方图时,
我们需要用一些代表性的颜色代替丰富的色彩空间,我们的思路是将每个通道的256种颜色用64种代替,
即将原来256种颜色划分64个颜色段,每个颜色段取中间的颜色值作为代表色。

 void colorReudce(Mat& image,int div)
  {
   for(int i=0; i<image.rows;i++)
   {
     for(int j=0;j<image.cols;j++)
     {
         image.at<Vec3b>(i,j)[0]= image.at<Vec3b>(i,j)[0]/div*div+div/2;
         image.at<Vec3b>(i,j)[1]= image.at<Vec3b>(i,j)[1]/div*div+div/2;
         image.at<Vec3b>(i,j)[2]= image.at<Vec3b>(i,j)[2]/div*div+div/2;
     }
   }
}

image.at(i,j):取出灰度图像中i行j列的点。
image.at(i,j)[k]:取出彩色图像中i行j列第k通道的颜色点。
其中uchar,Vec3b都是图像像素值的类型

2用指针来遍历图像
上图对原图像进行了修改,采用指针的形式可以保留原图,制作原图的副本

void colorReduce(Mat& image,Mat& outImage,int div)
{
   outImage.create(image.size(),image.type());
   const unchar* indata;
   unchar* outdata;
   int row=image.rows;
   int col=image.cols*image.channels();
   for(int i=0;i<row;i++)
   {
      indata=image.ptr<uchar>(i);
      outdata=outImage.ptr<uchar>(i);
      for(int j=0;j<col;j++)
      {
         outdata[j]=indata[i]/div*div+div/2;
      }

   }
}

Mat 通过.ptr<>函数得到一行的指针,并用[]操作符访问某一列的像素值
第i行数据的指针:image.ptr(i)。
并用[]操作符访问某一列的像素值

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值