opencv學習(5) 使用迭代器遍歷圖像的像素

圖像像素的遍歷可用指針和迭代器,本文介紹的是用迭代器遍歷圖像像素。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章