牛骨文教育服务平台(让学习变的简单)
博文笔记

OpenCV学习笔记三(2016年12月4日)像素值的读写

创建时间:2016-12-04 投稿人: 浏览次数:1470

1、at()函数遍历图像像素

函数at()对矩阵中某个像素进行读取或者对某个像素进行复制操作。但是效率并不高。

例如:uchar value = grayim.at<uchar>(i,j);  //读出第i行第j列像素值

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

//建立单通道的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;}

2、迭代器(iterator)遍历图像的所有像素

#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;
}

3、使用数据指针遍历图像像素

#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){
        
        //获取第 i 行首像素指针
        uchar * p = grayim.ptr<uchar>(i);
        //对第 i 行的每个像素(byte)操作
        for( int j = 0; j < grayim.cols; ++j ){
             p[j] = (i+j)%255;
        }
    }

    //遍历所有像素,并设置像素值
    for( int i = 0; i < colorim.rows; ++i){

        //获取第 i 行首像素指针
        Vec3b * p = colorim.ptr<Vec3b>(i);
        for( int j = 0; j < colorim.cols; ++j ){
             p[j][0] = i%255; //Blue
             p[j][1] = j%255; //Green
             p[j][2] = 0; //Red
         }
     }

    //显示结果
    imshow("grayim", grayim);
    imshow("colorim", colorim);
    waitKey(0);
    return 0;
}


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。