opencv學習之----使用迭代器遍歷圖像

 迭代器是一種極爲方便的可以遍歷數組或集合的方法,使用opencv的自帶的Mat中的迭代器,可以方便的進行遍歷數組操作。

在迭代法中,你所需要做的僅僅是獲得圖像矩陣的begin和end,然後增加迭代直至從begin到end。將*操作符添加在迭代指針前,即可訪問當前指向的內容。對於一個cv::Mat的實例,你可以通過image.begin<cv::Vec3b>()來得到圖像左上角位置的迭代器。如果想從第二行開始,可以使用image.begin<cv::Vec3b>()+image.rows來初始化迭代器。

注意:如果你的操作對象是const cv::Mat,或者你想強調當前當前循環不會對CV::Mat的實例進行修改,那麼你就因該創建常量迭代器。常量迭代器的聲明如下:

cv::Mat ConstIterator_<cv::Vec3b>it;

或者:

cv::Mat_<cv::Vec3b> ::Const_Iterator it;

程序代碼如下:

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

void colorReduce(cv::Mat& img, int div = 64);


int main()
{
	cv::Mat img_orginal = cv::imread("8.jpg");
	cv::Mat img_altered = img_orginal.clone();

	colorReduce(img_altered);

	cv::namedWindow("orignal");
	cv::imshow("orignal", img_orginal);
	cv::namedWindow("altered");
	cv::imshow("altered", img_altered);

	cv::waitKey();

	return 0;
}

void colorReduce(cv::Mat& img, int div)
{
	int n = cv::log(static_cast<double>(div)) / cv::log(2.0);
	int mask = 0xFF << n;   //使用位運算的顏色縮減公式,如果我們限制縮減因子爲2的冪次,
	                        //那麼,只取像素值的前n位即可得到不大於改制的關於縮減因子的最大整數倍數。運算掩膜可以通過簡單的移位操作。

	// 方式一:
	//cv::Mat_<cv::Vec3b>::iterator it = img.begin<cv::Vec3b>();    定義在MAT-內部的迭代器類型
	// 方式二:
	cv::MatIterator_<cv::Vec3b> it = img.begin<cv::Vec3b>();
	cv::MatIterator_<cv::Vec3b> itend = img.end<cv::Vec3b>();
	for (; it != img.end<cv::Vec3b>(); it++)
	{  //處理每個像素
		(*it)[0] = (*it)[0] & mask + div / 2;
		(*it)[1] = (*it)[1] & mask + div / 2;
		(*it)[2] = (*it)[2] & mask + div / 2;
	}
}

原始圖像:

運行結果:

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