访问像素的三种方法

方法一:用指针访问像素

 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

时间: 2024-07-31 08:49:03

访问像素的三种方法的相关文章

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

访问 Windows 窗体控件本质上不是线程安全的.如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态.还可能出现其他与线程相关的 bug,包括争用情况和死锁.确保以线程安全方式访问控件非常重要. 解决办法 1.把CheckForIllegalCrossThreadCalls设置为false 在多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,如果需要访问窗口中的控件,可以在窗口构造函数中将CheckForIllegalCrossThreadCalls设置为

Qt: 访问容器(三种方法,加上for循环就四种了)good

#include <iostream>#include <QString>#include <QList>#include <QListIterator> int main(int argc, char *argv[]) { QList<QString> list; list << "One" << "Two" << "Three"; foreach(

如何判断网站是不是ipad访问的?三种方法来判断

如何判断是否是 iPad 浏览器呢,关键是看它的 User Agent 中是否有 iPad.iPad 使用的是 Safari Mobile 浏览器,他的的 User Agent 是:Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10 Javascript functi

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

原文:http://www.cnblogs.com/luckboy/archive/2010/12/19/1910785.html 1.把CheckForIllegalCrossThreadCalls设置为false 2.利用委托 delegate void SetTextCallBack(string text); private void SetText(string text) { if (this.txt_a.InvokeRequired) { SetTextCallBack stcb

opencv 3.1.0 访问像素值的三种方法(C++)

三种方法分别问: 指针访问:void colorReduce_ptr(cv::Mat &inputImage, cv::Mat &outputImage, int div); 迭代器访问:void colorReduce_iterator(cv::Mat &inputImage, cv::Mat &outputImage, int div); 动态地址计算:void colorReduce_at(cv::Mat &inputImage, cv::Mat &o

转:访问 Microsoft SQL Server 元数据的三种方法

上海微创软件有限公司 肖桂东 适用读者:Microsoft SQL Server 中.高级用户 元数据简介 元数据 (metadata) 最常见的定义为"有关数据的结构数据",或者再简单一点就是"关于数据的信息",日常生活中的图例.图书馆目录卡和名片等都可以看作是元数据.在关系型数据库管理系统 (DBMS) 中,元数据描述了数据的结构和意义.比如在管理.维护 SQL Server 或者是开发数据库应用程序的时候,我们经常要获取一些涉及到数据库架构的信息:某个数据库中

struts2的action访问servlet API的三种方法

学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object get(Object key);可以获取request属性 Map getSession():可以得到session属性 Map getAppliction():可以得到ServletContext实例 2.action类实现 ServletContextAware,ServletRequestAwa

Action访问Servlet API的三种方法

一.为什么要访问Servlet API ? Struts2的Action并未与Servlet API进行耦合,这是Struts2 的一个改良,从而方便了单独对Action进行测试.但是对于Web控制器而言,不访问action是不行的,Struts提供了一种比较简单的方式来访问Servlet API . 二.通常我们需要访问的Servlet API 是 HttpSession.HttpservletRequest.ServletContext,分别对应了JSP内置对象 session,reques

OpenCV笔记(二)——查看Mat对象的数据的三种方法

我们有了Mat的对象之后,就可以开始对图像进行处理. 在图像的处理过程中,对数据的查看并且对其进行修改,这应当是比较频繁的操作了. 这里讲讲官方手册当中给出的三种方法. 第一种方法:使用指向Mat数据部分的指针. 代码如下: 1 Mat& ScanImageAndReduceC(Mat& I, const uchar* const table) 2 { 3 // accept only char type matrices 4 CV_Assert(I.depth() != sizeof(u