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 }
转载于:https://www.cnblogs.com/fpzs/p/9601167.html
OpenCV(图像处理)—访问像素的三种方法相关推荐
- OpenCV访问像素的三种方法
三种方法分别问: 指针访问:void colorReduce_ptr(cv::Mat &inputImage, cv::Mat &outputImage, int div); 迭代器访 ...
- OpenCV精进之路(零):访问图像中像素的三种方法
访问像素的三种方法 指针访问:最快 迭代器iterator:较慢,非常安全,指针访问可能出现越界问题 动态地址计算:更慢,通过at()实现.适用于访问具体某个第i行,j列的像素,而不适用遍历像素 这里 ...
- Opencv3编程入门学习笔记(三)之访问图像像素的三种方法
访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...
- 使用OpenCV进行人脸识别的三种方法
1 简介 OpenCV从版本2.4开始,加入了一个类FaceRecognizer,使用它可以方便的地进行人脸识别(源代码,在OpenCV的opencv\modules\contrib\doc\face ...
- NAS开通外网访问功能的三种方法
1.从运营商申请固定IP,直接与NAS映射 因为疫情影响,回不了市区家里,这个方法还没测试过. 2.购买云服务器,赠送公网IP,通过frp实现内网穿透 先从阿里云购买了一周(最短一周,3月14日到期) ...
- 遍历图片像素的三种方法
1.指针访问像素 void colorReduce(Mat& inputImage, Mat& outputImage, int div) {outputImage = inputIm ...
- C# .NET访问Oracle的三种方法(转)
转自:https://blog.csdn.net/hndaihui/article/details/79524072 首先介绍下开发环境:WIn10 64bit+Visual Studio 2015+ ...
- html输入密码访问指定页面,三种方法使HTML单页面输入密码才能访问
方法一 function password() { var testV = 1; var pass1 = prompt('请输入密码',''); while (testV < 3) { if ( ...
- 线程间操作无效:从不是创建控件的线程访问它的三种方法
访问 Windows 窗体控件本质上不是线程安全的.如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态.还可能出现其他与线程相关的 bug,包括争用情况和死锁.确保以线程安 ...
最新文章
- python 用户认证_python基于mysql的用户认证
- JS 设计模式 四(单例)
- 算法复习(7)有序二叉树
- 【Codeforces Round #446 (Div. 2) C】Pride
- 2021湖北高考个人成绩排名查询,2021湖北高考总成绩一分一段排名
- 这是一份面向Android开发者的复习指南,成功入职字节跳动
- 微软有“病”,推出bing,看上去算象个站内搜索,心寒!
- ARM9学习笔记之——SDRAM实验
- 计算机一级win7操作题,计算机等级考试一级WIN7操作题.docx
- matlab pv图,Matlab中imagesc
- html flash带播放视频源码,HTML嵌套Flash播放视频
- html动态背景个人引导页,Web前端动态背景特效合集
- win8虚拟机_老司机教你如何在虚拟机安装win8系统,双系统也可以这样实现
- 使用SecureCRT登录本机cygwin【转】
- 关于PyQt5 菜单点击实现打开chm格式的文件
- Python实验-小黑屋
- 关爱的艺术 - 致敬疫情前线奋战的医护人员!
- 关于TI的28335芯片概述
- 三维实景沙盘数字模拟沙盘M3DGIS系统开发教程第18课
- webpack多环境(dev stg prd qa)打包问题 1
热门文章
- 音乐u盘排序软件_传输数据快速的各种U盘系列 定制U盘
- zabbix中mysql连不上的排错_zabbix使用排错 - oschina130111的个人空间 - OSCHINA - 中文开源技术交流社区...
- 多项目加载顺序修改_面试官:Java 类在 Tomcat 中是如何加载的?
- python six库安装_Python 安装matplotlib,six,dateutil,pyparsing 完整过程
- python搭建django环境_在BAE上搭建python,django环境小记
- python为运行为何出现乱码_python中文的显示乱码怎么办
- Python机器学习工具箱
- html的字母u代表什么意思,html元素 u 标签的使用方法及作用
- 系统学习深度学习(十一)--dropout,dropconect
- KNN(二)--近似最近邻算法ANN