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)。
并用[]操作符访问某一列的像素值