OpenCV使用迭代器对像素进行快速操作

文/七里雪飘(简书作者)
原文链接:http://www.jianshu.com/p/21f730c80a6d
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

图像的格式
  • vec3b的意思



    • 像素的遍历(也就是像素的读写)
      1. at( )函数
        函数at()来实现读去矩阵中的某个像素的赋值操作下面两行代码演示了 at()函数的使用方法。

      uchar value = grayim.at<uchar>(i,j);//读出第i行第j列
      grayim.at<uchar>(i,j)=128; //将第i 行第j 列像素值设置

      如果要对图像进行遍历,可以参考下面的例程。这个例程创分别是单通道的 grayim 以及 3 个通道的 colorim,然后对两个图进行赋值,最后现实结果。

    #include <iostream> 
    #include "opencv2/opencv.hpp" 
    using namespace std; 
    using namespace cv; 
    
    int main(int argc, char* argv[]) 
    { 
    Mat grayim(600, 800, CV_8UC1); 
    Mat colorim(600, 800, CV_8UC3); 
    
    //遍历所有像素,并设置像素值 
    for( int i = 0; i < grayim.rows; ++i) 
        for( int j = 0; j < grayim.cols; ++j ) 
            grayim.at<uchar>(i,j) = (i+j)%255; 
    
    //遍历所有像素,并设置像素值 
    for( int i = 0; i < colorim.rows; ++i) 
        for( int j = 0; j < colorim.cols; ++j ) 
        { 
            Vec3b pixel; 
            pixel[0] = i%255; //Blue 
            pixel[1] = j%255; //Green 
            pixel[2] = 0;     //Red 
            colorim.at<Vec3b>(i,j) = pixel; 
        } 
    
    //显示结果 
    imshow("grayim", grayim); 
    imshow("colorim", colorim); 
    waitKey(0); 
    
    return 0; 
     }

    需要注意的是,如果要遍历图像,并不推荐使用 at()函数。使用这个函数的优点是代码的可读性高,但是效率并不是很高。
    2. 使用迭代器 (本人强烈推荐)
      如果你熟悉C++的STL 库,那一定了解迭代器(iterator)的使用。迭代器可以方便地遍历所有元素。Mat 也增加了迭代器的支持,以便于矩阵元素的遍历。下面的例程功能跟上一节的例程类似,但是由于使用了迭代器,而不是使用行数
    和列数来遍历,所以这儿没有了 i和j 变量,图像的像素值设置为一个随机数。

       #include <iostream> 
       #include "opencv2/opencv.hpp" 
        using namespace std; 
        using namespace cv; 
    
        int main(int argc, char* argv[]) 
        { 
              Mat grayim(600, 800, CV_8UC1); 
              Mat colorim(600, 800, CV_8UC3); 
    
        //遍历所有像素,并设置像素值 
              MatIterator_<uchar> grayit, grayend; 
        for(  grayit  =  grayim.begin<uchar>(),  grayend  = 
                    grayim.end<uchar>(); grayit != grayend; ++grayit) 
        *grayit = rand()%255; 
    
          //遍历所有像素,并设置像素值 
          MatIterator_<Vec3b> colorit, colorend; 
          for(  colorit  =  colorim.begin<Vec3b>(),  colorend  = 
                      colorim.end<Vec3b>(); colorit != colorend; ++colorit) 
          { 
                          (*colorit)[0] = rand()%255; //Blue 
                          (*colorit)[1] = rand()%255; //Green 
                          (*colorit)[2] = rand()%255; //Red 
            } 
    
                //显示结果 
              imshow("grayim", grayim); 
              imshow("colorim", colorim); 
              waitKey(0); 
    
          return 0; 
          }


    文/七里雪飘(简书作者)
    原文链接:http://www.jianshu.com/p/21f730c80a6d
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值