(12)用迭代器扫描图像

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cup160828/article/details/81046838
#include<opencv2/opencv.hpp>
#include<iostream>


using namespace std;
using namespace cv;


void colorReduce(Mat image, int div = 64)
{
int n = static_cast<int> (
log(static_cast<double>(div)) / log(2.0) + 0.5
);
//用来截取像素值的掩码
uchar mask = 0xff << n;
uchar div2 = div / 2;
//迭代器
MatIterator_<Vec3b> it=image.begin<Vec3b>();
MatIterator_<Vec3b> itend=image.end<Vec3b>();
//等价于以下三行(这样便不需要在begin和end方法中指定迭代器的类型了,
//因为在创建Mat_引用时迭代器类型已被指定
//Mat_<Vec3b> cimage(image);
//Mat_<Vec3b>::iterator it=cimage.begin();
//Mat_<Vec3b>::iterator itend=cimage.end();


//扫描全部像素
for (; it != itend; it++)
{
(*it)[0] &= mask;
(*it)[0] += div2;
(*it)[1] &= mask;
(*it)[1] += div2;
(*it)[2] &= mask;
(*it)[2] += div2;
//等价于以下两行(使用了cv::Vec3b的重载运算符)
//const cv::Vec3b offset(div2,div2,div2)
//*it=*it/div*div+offset;
}
}
int main()
{
//读入图像
Mat image = imread("C:\\Users\\Administrator\\Desktop\\1.jpg");
colorReduce(image);
//显示结果
namedWindow("Image");
imshow("Image", image);
waitKey(0);
return 0;
}

猜你喜欢

转载自blog.csdn.net/cup160828/article/details/81046838