zoukankan      html  css  js  c++  java
  • OpenCV(图像处理)—访问像素的三种方法

    方法一:用指针访问像素

     1 #include <opencv2/opencv.hpp>
     2 #include <opencv2/core/core.hpp>
     3 #include <opencv2/highgui/highgui.hpp>
     4 using namespace cv;
     5 using namespace std;
     6 void colorReduce(Mat &inputImage,Mat& outputImage,int div)
     7 {
     8 outputImage=inputImage.clone();//复制实参到临时变量
     9 int rowNumber=outputImage.rows;//行数
    10 int colNumber=outputImage.cols*outputImage.channels();//即每行元素个数=列数*通道数
    11 for(int i=0;i<rowNumber;i++)   //行循环    
    12 {
    13     uchar* data=outputImage.ptr<uchar>(i);//获取第i行的首地址
    14     for(int j=0;j<colNumber;j++)//列循环
    15     {
    16         data[j]=data[j]/div*div+div/2;//处理每个像素
    17     }
    18 }
    19 }
    20 
    21 int main()
    22 {
    23     Mat srcImage=imread("E://lena.jpg");
    24 imshow("原始数据",srcImage);
    25 Mat dstImage;
    26 dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());//效果图的大小、类型与原图片相同
    27 double time0=static_cast<double>(getTickCount());
    28 colorReduce(srcImage,dstImage,32);//调用颜色空间缩减函数
    29 time0=((double)getTickCount()-time0)/getTickFrequency();//计算运行时间
    30 cout<<"此方法运行时间:"<<time0<<""<<endl;
    31 imshow("效果图",dstImage);
    32 waitKey(0);
    33 
    34 }

    运行效果:

    方法二:用迭代器iterator操作像素

     1 #include <opencv2/opencv.hpp>
     2 #include <opencv2/core/core.hpp>
     3 #include <opencv2/highgui/highgui.hpp>
     4 using namespace cv;
     5 using namespace std;
     6 
     7 void colorReduce(Mat &inputImage,Mat& outputImage,int div)
     8 {
     9 outputImage=inputImage.clone();//复制实参到临时变量
    10 //获取迭代器
    11 Mat_<Vec3b>::iterator it=outputImage.begin<Vec3b>();//初始位置的迭代器
    12 Mat_<Vec3b>::iterator itend=outputImage.end<Vec3b>();//终止位置的迭代器
    13 //存储彩色图像像素
    14     for(;it !=itend;++it)     
    15     {
    16         (*it)[0]=(*it)[0]/div*div+div/2;
    17         (*it)[1]=(*it)[1]/div*div+div/2;
    18         (*it)[2]=(*it)[2]/div*div+div/2;
    19     }
    20 }
    21 int main()
    22 {
    23     Mat srcImage=imread("E://lena.jpg");
    24 imshow("原始数据",srcImage);
    25 Mat dstImage;
    26 dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());//效果图的大小、类型与原图片相同
    27 double time0=static_cast<double>(getTickCount());
    28 colorReduce(srcImage,dstImage,32);//调用颜色空间缩减函数
    29 time0=((double)getTickCount()-time0)/getTickFrequency();//计算运行时间
    30 cout<<"此方法运行时间:"<<time0<<""<<endl;
    31 imshow("效果图",dstImage);
    32 waitKey(0);
    33 
    34 }

    运行结果:

    方法三:动态地址计算

     1 #include <opencv2/opencv.hpp>
     2 #include <opencv2/core/core.hpp>
     3 #include <opencv2/highgui/highgui.hpp>
     4 using namespace cv;
     5 using namespace std;
     6 
     7 //方法三:动态地址计算
     8 void colorReduce(Mat &inputImage,Mat& outputImage,int div)
     9 {
    10 outputImage=inputImage.clone();//复制实参到临时变量
    11 int rowNumber=outputImage.rows;//行数
    12 int colNumber=outputImage.cols;//列数
    13 //存取彩色图像像素
    14 for(int i=0;i<rowNumber;i++)       
    15 {
    16     
    17     for(int j=0;j<colNumber;j++)
    18     {
    19         outputImage.at<Vec3b>(i,j)[0]=outputImage.at<Vec3b>(i,j)[0]/div*div+div/2;//蓝色通道
    20         outputImage.at<Vec3b>(i,j)[1]=outputImage.at<Vec3b>(i,j)[1]/div*div+div/2;//绿色通道
    21         outputImage.at<Vec3b>(i,j)[2]=outputImage.at<Vec3b>(i,j)[2]/div*div+div/2;//红色通道
    22     }
    23 }
    24 }
    25 int main()
    26 {
    27     Mat srcImage=imread("E://lena.jpg");
    28 imshow("原始数据",srcImage);
    29 Mat dstImage;
    30 dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());//效果图的大小、类型与原图片相同
    31 double time0=static_cast<double>(getTickCount());
    32 colorReduce(srcImage,dstImage,32);//调用颜色空间缩减函数
    33 time0=((double)getTickCount()-time0)/getTickFrequency();//计算运行时间
    34 cout<<"此方法运行时间:"<<time0<<""<<endl;
    35 imshow("效果图",dstImage);
    36 waitKey(0);
    37 
    38 }
    萍水相逢逢萍水,浮萍之水水浮萍!
  • 相关阅读:
    easyExcel入门
    UML-从需求到设计--迭代进化
    UML-操作契约总结
    102. Binary Tree Level Order Traversal
    98. Validate Binary Search Tree
    95. Unique Binary Search Trees II
    96. Unique Binary Search Trees
    94. Binary Tree Inorder Traversal
    84. Largest Rectangle in Histogram
    92. Reverse Linked List II
  • 原文地址:https://www.cnblogs.com/AIBigTruth/p/9601167.html
Copyright © 2011-2022 走看看