opencv:访问图像中像素的三类方法

来源:互联网 发布:战舰世界 知乎 编辑:程序博客网 时间:2024/05/21 10:30

见代码分析:

#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <iostream>using namespace std;using namespace cv;//全局函数声明void colorReduce (Mat& inputImage, Mat& outputImage, int div);//main函数入口int main(){    //创建原始图并显示    Mat srcImage = imread("1.jpg");    imshow("原始图", srcImage);    //按原始图的参数规格来创建效果图    Mat dstImage;    dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());   //效果图的大小、类型与原图片相同    //记录起始时间    double time0 = static_cast<double>(getTickCount());     //调用颜色空间缩减函数    colorReduce(srcImage,dstImage,32);    //计算运行时间并输出    time0 = ((double)getTickCount() - time0)/getTickFrequency();    cout << "此方法运行时间为:"<< time0 << "秒" << endl; //输出运行时间    //显示效果图    imshow("效果图",dstImage);    waitKey(0);}//采用指针访问像素//void colorReduce(Mat& inputImage,Mat& outputImage,int div)//{//  //参数准备//  outputImage = inputImage.clone();   //复制实参到临时变量//  int rowNumber = outputImage.rows;   //行数//  int colNumber = outputImage.cols*outputImage.channels();    //列数x通道数=每一行元素的个数////  //双重循环,遍历所有的像素值//  for(int i = 0;i < rowNumber; i++)   //行循环//  {//      uchar* data = outputImage.ptr<uchar>(i);    //获取第i行的首地址//      for(int j = 0;j<colNumber;j++)  //列循环//      {//          //开始处理每个像素//          data[j] = data[j]/div*div + div/2;//      }//  }//}//采用迭代器操作像素//void colorReduce(Mat& inputImage,Mat& outputImage,int div)//{//  //参数准备//  outputImage = inputImage.clone();   //复制实参到临时变量//  //获取迭代器//  Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>();  //初始位置迭代器//  Mat_<Vec3b>::iterator itend = outputImage.end<Vec3b>(); //终止位置的迭代器////  //存取彩色图像像素//  for(; it != itend;++it)//  {//      //开始处理每个像素//      (*it)[0] = (*it)[0]/div*div + div/2;//      (*it)[1] = (*it)[1]/div*div + div/2;//      (*it)[2] = (*it)[2]/div*div + div/2;//  }////}//动态地址计算void colorReduce(Mat& inputImage,Mat& outputImage,int div){    outputImage = inputImage.clone();   //复制实参到临时变量    int rowNumber = outputImage.rows;   //行数    int colNumber = outputImage.cols;   //列数    //存取彩色图像像素    for(int i=0;i<rowNumber;i++)    {        for(int j=0;j<colNumber;j++)        {            outputImage.at<Vec3b>(i,j)[0] = outputImage.at<Vec3b>(i,j)[0]/div*div + div/2;  //蓝色通道            outputImage.at<Vec3b>(i,j)[1] = outputImage.at<Vec3b>(i,j)[1]/div*div + div/2;  //绿色通道            outputImage.at<Vec3b>(i,j)[2] = outputImage.at<Vec3b>(i,j)[2]/div*div + div/2;  //红色通道        }    }}
0 0
原创粉丝点击