aihot  2017-05-08 16:04:23  OpenCV |   查看评论   

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):图像的遍历

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]