方法一:用指针访问像素

 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 }

转载于:https://www.cnblogs.com/fpzs/p/9601167.html

OpenCV(图像处理)—访问像素的三种方法相关推荐

  1. OpenCV访问像素的三种方法

    三种方法分别问: 指针访问:void colorReduce_ptr(cv::Mat &inputImage, cv::Mat &outputImage, int div); 迭代器访 ...

  2. OpenCV精进之路(零):访问图像中像素的三种方法

    访问像素的三种方法 指针访问:最快 迭代器iterator:较慢,非常安全,指针访问可能出现越界问题 动态地址计算:更慢,通过at()实现.适用于访问具体某个第i行,j列的像素,而不适用遍历像素 这里 ...

  3. Opencv3编程入门学习笔记(三)之访问图像像素的三种方法

    访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...

  4. 使用OpenCV进行人脸识别的三种方法

    1 简介 OpenCV从版本2.4开始,加入了一个类FaceRecognizer,使用它可以方便的地进行人脸识别(源代码,在OpenCV的opencv\modules\contrib\doc\face ...

  5. NAS开通外网访问功能的三种方法

    1.从运营商申请固定IP,直接与NAS映射 因为疫情影响,回不了市区家里,这个方法还没测试过. 2.购买云服务器,赠送公网IP,通过frp实现内网穿透 先从阿里云购买了一周(最短一周,3月14日到期) ...

  6. 遍历图片像素的三种方法

    1.指针访问像素 void colorReduce(Mat& inputImage, Mat& outputImage, int div) {outputImage = inputIm ...

  7. C# .NET访问Oracle的三种方法(转)

    转自:https://blog.csdn.net/hndaihui/article/details/79524072 首先介绍下开发环境:WIn10 64bit+Visual Studio 2015+ ...

  8. html输入密码访问指定页面,三种方法使HTML单页面输入密码才能访问

    方法一 function password() { var testV = 1; var pass1 = prompt('请输入密码',''); while (testV < 3) { if ( ...

  9. 线程间操作无效:从不是创建控件的线程访问它的三种方法

    访问 Windows 窗体控件本质上不是线程安全的.如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态.还可能出现其他与线程相关的 bug,包括争用情况和死锁.确保以线程安 ...

最新文章

  1. python 用户认证_python基于mysql的用户认证
  2. JS 设计模式 四(单例)
  3. 算法复习(7)有序二叉树
  4. 【Codeforces Round #446 (Div. 2) C】Pride
  5. 2021湖北高考个人成绩排名查询,2021湖北高考总成绩一分一段排名
  6. 这是一份面向Android开发者的复习指南,成功入职字节跳动
  7. 微软有“病”,推出bing,看上去算象个站内搜索,心寒!
  8. ARM9学习笔记之——SDRAM实验
  9. 计算机一级win7操作题,计算机等级考试一级WIN7操作题.docx
  10. matlab pv图,Matlab中imagesc
  11. html flash带播放视频源码,HTML嵌套Flash播放视频
  12. html动态背景个人引导页,Web前端动态背景特效合集
  13. win8虚拟机_老司机教你如何在虚拟机安装win8系统,双系统也可以这样实现
  14. 使用SecureCRT登录本机cygwin【转】
  15. 关于PyQt5 菜单点击实现打开chm格式的文件
  16. Python实验-小黑屋
  17. 关爱的艺术 - 致敬疫情前线奋战的医护人员!
  18. 关于TI的28335芯片概述
  19. 三维实景沙盘数字模拟沙盘M3DGIS系统开发教程第18课
  20. webpack多环境(dev stg prd qa)打包问题 1

热门文章

  1. 音乐u盘排序软件_传输数据快速的各种U盘系列 定制U盘
  2. zabbix中mysql连不上的排错_zabbix使用排错 - oschina130111的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. 多项目加载顺序修改_面试官:Java 类在 Tomcat 中是如何加载的?
  4. python six库安装_Python 安装matplotlib,six,dateutil,pyparsing 完整过程
  5. python搭建django环境_在BAE上搭建python,django环境小记
  6. python为运行为何出现乱码_python中文的显示乱码怎么办
  7. Python机器学习工具箱
  8. html的字母u代表什么意思,html元素 u 标签的使用方法及作用
  9. 系统学习深度学习(十一)--dropout,dropconect
  10. KNN(二)--近似最近邻算法ANN