方法一:用指针访问像素

 #include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
void colorReduce(Mat &inputImage,Mat& outputImage,int div)
{
outputImage=inputImage.clone();//复制实参到临时变量
int rowNumber=outputImage.rows;//行数
int colNumber=outputImage.cols*outputImage.channels();//即每行元素个数=列数*通道数
for(int i=;i<rowNumber;i++) //行循环
{
uchar* data=outputImage.ptr<uchar>(i);//获取第i行的首地址
for(int j=;j<colNumber;j++)//列循环
{
data[j]=data[j]/div*div+div/;//处理每个像素
}
}
} int main()
{
Mat srcImage=imread("E://lena.jpg");
imshow("原始数据",srcImage);
Mat dstImage;
dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());//效果图的大小、类型与原图片相同
double time0=static_cast<double>(getTickCount());
colorReduce(srcImage,dstImage,);//调用颜色空间缩减函数
time0=((double)getTickCount()-time0)/getTickFrequency();//计算运行时间
cout<<"此方法运行时间:"<<time0<<"秒"<<endl;
imshow("效果图",dstImage);
waitKey(); }

运行效果:

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

 #include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std; 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)[]=(*it)[]/div*div+div/;
(*it)[]=(*it)[]/div*div+div/;
(*it)[]=(*it)[]/div*div+div/;
}
}
int main()
{
Mat srcImage=imread("E://lena.jpg");
imshow("原始数据",srcImage);
Mat dstImage;
dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());//效果图的大小、类型与原图片相同
double time0=static_cast<double>(getTickCount());
colorReduce(srcImage,dstImage,);//调用颜色空间缩减函数
time0=((double)getTickCount()-time0)/getTickFrequency();//计算运行时间
cout<<"此方法运行时间:"<<time0<<"秒"<<endl;
imshow("效果图",dstImage);
waitKey(); }

运行结果:

方法三:动态地址计算

 #include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std; //方法三:动态地址计算
void colorReduce(Mat &inputImage,Mat& outputImage,int div)
{
outputImage=inputImage.clone();//复制实参到临时变量
int rowNumber=outputImage.rows;//行数
int colNumber=outputImage.cols;//列数
//存取彩色图像像素
for(int i=;i<rowNumber;i++)
{ for(int j=;j<colNumber;j++)
{
outputImage.at<Vec3b>(i,j)[]=outputImage.at<Vec3b>(i,j)[]/div*div+div/;//蓝色通道
outputImage.at<Vec3b>(i,j)[]=outputImage.at<Vec3b>(i,j)[]/div*div+div/;//绿色通道
outputImage.at<Vec3b>(i,j)[]=outputImage.at<Vec3b>(i,j)[]/div*div+div/;//红色通道
}
}
}
int main()
{
Mat srcImage=imread("E://lena.jpg");
imshow("原始数据",srcImage);
Mat dstImage;
dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());//效果图的大小、类型与原图片相同
double time0=static_cast<double>(getTickCount());
colorReduce(srcImage,dstImage,);//调用颜色空间缩减函数
time0=((double)getTickCount()-time0)/getTickFrequency();//计算运行时间
cout<<"此方法运行时间:"<<time0<<"秒"<<endl;
imshow("效果图",dstImage);
waitKey(); }

OpenCV(图像处理)—访问像素的三种方法的更多相关文章

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

    #include <iostream>#include <QString>#include <QList>#include <QListIterator> ...

  2. C++中,访问字符串的三种方法

    1.用字符数组存放一个字符串 程序1:定义一个字符数组并初始化,然后输出其中的字符串. #include<iostream> using namespace std; int main() ...

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

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

  4. opencv图像阈值设置的三种方法

    1.简单阈值设置   像素值高于阈值时,给这个像素赋予一个新值(可能是白色),否则我们给它赋予另外一种颜色(也许是黑色).这个函数就是 cv2.threshhold().这个函数的第一个参数就是原图像 ...

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

    学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object g ...

  6. Action访问Servlet API的三种方法

    一.为什么要访问Servlet API ? Struts2的Action并未与Servlet API进行耦合,这是Struts2 的一个改良,从而方便了单独对Action进行测试.但是对于Web控制器 ...

  7. 【Android】Eclipse自动编译NDK/JNI的三种方法

    [Android]Eclipse自动编译NDK/JNI的三种方法 SkySeraph Sep. 18th  2014 Email:skyseraph00@163.com 更多精彩请直接访问SkySer ...

  8. JAVA之线程同步的三种方法

    最近接触到一个图片加载的项目,其中有声明到的线程池等资源需要在系统中线程共享,所以就去研究了一下线程同步的知识,总结了三种常用的线程同步的方法,特来与大家分享一下.这三种方法分别是:synchroni ...

  9. java解析xml的三种方法

    java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXE ...

随机推荐

  1. java web程序 String的valueOf方法总集

    在代码中用到类型转换的时候,是一个字符,然后当用户在网页中输入的是字符串, 字符转换成字符串的方法是: String.valueOf(char c);就好了 这样在写验证码的时候,网页端的就是字符串形 ...

  2. java ssl https 连接详解 生成证书 tomcat keystone

    java ssl https 连接详解 生成证书 我们先来了解一下什么理HTTPS 1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over ...

  3. 接口测试maven管理

    接口测试框架选择 界面化工具,针对不会编码的测试人员: 1.Jmeter性能测试工具,不具备完备的接口测试框架功能 2.Robotframerwork 3.PostMan 推荐框架: ResrAssu ...

  4. WAP网站WML或HTML页面自适应手机屏幕实现方法

     把图片和div的宽度都设置成:width:100%就可以了

  5. centos 7.5 安装mongodb

    MongoDB安装和启动 从官网下载最新对应的版本然后解压,本文以3.6.9为例,将文件拷贝到opt目录下,然后解压: [root@localhost opt]# tar zxvf mongodb-l ...

  6. Spring MVC 原生API

    原生API: Servlet环境中一些有用的对象: HttpServletRequest HttpServletResponse HttpSession Reader Writer InputStre ...

  7. OpenGL chapter3 基础渲染

    3.1 基础图形管线 三种向OpenGl着色器传递渲染数据的方法:属性,Uniform和纹理.3.2 创建坐标系 3.2.1 正投影 GLFrustum::SetOrthographic(⋯⋯): 3 ...

  8. Oracle内存详解之二 Library cache 库缓冲-转载

    Library cache是Shared pool的一部分,它几乎是Oracle内存结构中最复杂的一部分,主要存放shared curosr(SQL)和PLSQL对象(function,procedu ...

  9. ExtJS模板与菜单的使用案例-床位卡

    ExtJS的模板的使用: 项目中场景基本就是表格模型: TPL:自己编写模板 store:数据源 UI组件: tbar,rbr,bbar实现工具栏 PageBar与StatusBar:可以针对TPL的 ...

  10. Win7关机时弹出对话框,提示你想要的信息

    博主换了个公司,要求每天写日志,次日8点前没写的话就要扣钱,1篇10块钱,博主已经两次写完忘记提交到ERP系统了,捂脸... 因为公司要求所有工作在公司配的台式电脑上,所以如果能在关机前弹个提示(不关 ...