方法一:用指针访问像素

 #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. 接口测试3-2csv格式

    csv文件数据 IntellJ IDEA打开终端:view-tool windows-terminal,可以在终端中查看文件路径 阿里 马云 京东 刘强东 京东 马化腾 #java //读取csv文件 ...

  2. python中获取当前路径并添加到系统路径

    import os import sys sys.path.append(os.getcwd())

  3. CSS Web安全字体组合

    常用的字体组合 font-family属性是多种字体的名称,作为一个"应变"制度,以确保浏览器/操作系统之间的最大兼容性.如果浏览器不支持的第一个字体,它尝试下一个的字体. 你想要 ...

  4. python之路_函数实例及装饰器介绍

    一.习题讲解 1.写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组.例如:[(‘红心’,2), (‘草花’,2), …(‘黑桃,‘A’)] def cards(): num=[] for v ...

  5. final修饰的类有什么特点

    变量定义为final,一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变. 方法定义为final,是为了防止任何继承类改变它. 类定义为final, ...

  6. sql上下级关系查询

    有一张存在上下级关系的function表,parentId表示上级Id,现要查询出上级菜单下的子菜单,每个子菜单显示成以逗号分隔的字符串 表结构如下: create table menu ( id i ...

  7. OpenACC 优化矩阵乘法

    ▶ 按书上的步骤使用不同的导语优化矩阵乘法 ● 所有的代码 #include <iostream> #include <cstdlib> #include <chrono ...

  8. SQLserver查看索引使用情况

    查索引使用情况:    https://www.cnblogs.com/sunliyuan/p/6559354.html select db_name(database_id) as N'TOPK_T ...

  9. XMind8 安装

    参考:https://blog.csdn.net/qq_35911589/article/details/81901868 https://blog.csdn.net/Zjhao666/article ...

  10. HTML5 通过文件输入框读取文件为base64文件, 并借助canvas压缩 FileReader, files, drawImage

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...