Mat_<Vec3b>::iterator it;
如果迭代器指向一个const图像,则可以用下面的声明:
MatConstIterator<Vec3b> it; 或者
Mat_<Vec3b>::const_iterator it;
下面我们用迭代器来简化上面的colorReduce程序:
1 void colorReduce(const Mat& image,Mat& outImage,int div) 2 { 3 outImage.create(image.size(),image.type()); 4 MatConstIterator_<Vec3b> it_in=image.begin<Vec3b>(); 5 MatConstIterator_<Vec3b> itend_in=image.end<Vec3b>(); 6 MatIterator_<Vec3b> it_out=outImage.begin<Vec3b>(); 7 MatIterator_<Vec3b> itend_out=outImage.end<Vec3b>(); 8 while(it_in!=itend_in) 9 { 10 (*it_out)[0]=(*it_in)[0]/div*div+div/2; 11 (*it_out)[1]=(*it_in)[1]/div*div+div/2; 12 (*it_out)[2]=(*it_in)[2]/div*div+div/2; 13 it_in++; 14 it_out++; 15 } 16 }
如果你想从第二行开始,则可以从image.begin<Vec3b>()+image.rows开始。
上面4种方法中,第3种方法的效率最高!
五、图像的邻域操作
很多时候,我们对图像处理时,要考虑它的邻域,比如3*3是我们常用的,这在图像滤波、去噪中最为常见,下面我们介绍如果在一次图像遍历过程中进行邻域的运算。
下面我们进行一个简单的滤波操作,滤波算子为[0 –1 0;-1 5 –1;0 –1 0]。
它可以让图像变得尖锐,而边缘更加突出。核心公式即:sharp(i.j)=5*image(i,j)-image(i-1,j)-image(i+1,j
)-image(i,j-1)-image(i,j+1)。
1 void ImgFilter2d(const Mat &image,Mat& result) 2 { 3 result.create(image.size(),image.type()); 4 int nr=image.rows; 5 int nc=image.cols*image.channels(); 6 for(int i=1;i<nr-1;i++) 7 { 8 const uchar* up_line=image.ptr<uchar>(i-1);//指向上一行 9 const uchar* mid_line=image.ptr<uchar>(i);//当前行 10 const uchar* down_line=image.ptr<uchar>(i+
除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自OpenCV成长之路(2):图像的遍历