圖像像素的周遊可用指針和疊代器,本文介紹的是用疊代器周遊圖像像素。
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()方法修改。