迭代器是一種極爲方便的可以遍歷數組或集合的方法,使用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;
}
}
原始圖像:
運行結果: