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

opencv学习(5) 使用迭代器遍历图像的像素

2013-12-22 15:12 561 查看
图像像素的遍历可用指针和迭代器,本文介绍的是用迭代器遍历图像像素。

opencv定义的迭代器也是模板,我们这里定义在Mat_模板内部类型。详细介绍大家可以参考:Robert Laganière. OpenCV 2 Computer Vision Application Programming Cookbook,2011. 一书。

/*
*本程序的作用是用迭代器遍历图像,然后将图像减色
*2013年12月22日,
*/

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

void colorReduce(Mat &image, int div = 64);

int main()
{
Mat image = imread("D:\\fodder\\6.jpg");
Mat image2 = image;//注意这样直接赋值,image 和image2 将指向同一内存区间,属于浅拷贝
//也就是说,操作图像2同时也改变了图像1的原始数据

if(!image.data)
return -1;
else
{
colorReduce(image2, 32);

namedWindow("原图像");
imshow("原图像", image);
namedWindow("减色图像");
imshow("减色图像", image2);
imwrite("减色图像.jpg", image2);

waitKey(0);
destroyAllWindows();
}

return 0;
}

void colorReduce(Mat &image, int div)
{
//定义在Mat_模板类内部的迭代器
//
Mat_<Vec3b>::iterator diedaiqi = image.begin<Vec3b>();
//
Mat_<Vec3b>::iterator diedaiqiEnd = image.end<Vec3b>();

for(; diedaiqi != diedaiqiEnd; diedaiqi++)
{
//
(*diedaiqi)[0] = (*diedaiqi)[0] /div * div + div/2;
(*diedaiqi)[1] = (*diedaiqi)[1] /div * div + div/2;
(*diedaiqi)[2] = (*diedaiqi)[2] /div * div + div/2;
}
}

结果:原图像


减色图像


因为操作图像结果改变了原图像,因此显示的是结果图像。如果要显示原图像需要用copyTo()方法修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: