天天看點

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;
	}
}
           

結果:原圖像

opencv學習(5) 使用疊代器周遊圖像的像素

減色圖像

opencv學習(5) 使用疊代器周遊圖像的像素

因為操作圖像結果改變了原圖像,是以顯示的是結果圖像。如果要顯示原圖像需要用copyTo()方法修改。