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

来源:互联网 发布:linux lsof 安装 编辑:程序博客网 时间:2024/04/27 06:48

图像像素的遍历可用指针和迭代器,本文介绍的是用迭代器遍历图像像素。

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()方法修改。

0 0