您的位置:首页 > 运维架构

Opencv图像的遍历_at_ptr

2016-05-16 16:20 375 查看
opencv_at_ptr 图像的遍历

/article/5069448.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)。

并用[]操作符访问某一列的像素值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: