OpenCV(图像处理)—访问像素的三种方法
方法一:用指针访问像素
#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(图像处理)—访问像素的三种方法的更多相关文章
- Qt: 访问容器(三种方法,加上for循环就四种了)good
#include <iostream>#include <QString>#include <QList>#include <QListIterator> ...
- C++中,访问字符串的三种方法
1.用字符数组存放一个字符串 程序1:定义一个字符数组并初始化,然后输出其中的字符串. #include<iostream> using namespace std; int main() ...
- opencv 3.1.0 访问像素值的三种方法(C++)
三种方法分别问: 指针访问:void colorReduce_ptr(cv::Mat &inputImage, cv::Mat &outputImage, int div); 迭代器访 ...
- opencv图像阈值设置的三种方法
1.简单阈值设置 像素值高于阈值时,给这个像素赋予一个新值(可能是白色),否则我们给它赋予另外一种颜色(也许是黑色).这个函数就是 cv2.threshhold().这个函数的第一个参数就是原图像 ...
- struts2的action访问servlet API的三种方法
学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object g ...
- Action访问Servlet API的三种方法
一.为什么要访问Servlet API ? Struts2的Action并未与Servlet API进行耦合,这是Struts2 的一个改良,从而方便了单独对Action进行测试.但是对于Web控制器 ...
- 【Android】Eclipse自动编译NDK/JNI的三种方法
[Android]Eclipse自动编译NDK/JNI的三种方法 SkySeraph Sep. 18th 2014 Email:skyseraph00@163.com 更多精彩请直接访问SkySer ...
- JAVA之线程同步的三种方法
最近接触到一个图片加载的项目,其中有声明到的线程池等资源需要在系统中线程共享,所以就去研究了一下线程同步的知识,总结了三种常用的线程同步的方法,特来与大家分享一下.这三种方法分别是:synchroni ...
- java解析xml的三种方法
java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXE ...
随机推荐
- shell 2变量
shell变量 定义变量 变量名命名规则: 1.命名只能使用英文字母.数字和下划线,首个字符不能以数字开头 2.中间不能有空格,可以使用下划线 3.不能使用标点符号 4.不能使用sh中的关键字,可用h ...
- 关于ie6下png背景透明
今天我突破了一个技术难关,真的是头都大了.. 关于ie6下png背景透明的解决方法,我就不多说了,网上有很多解决方法,我用的是其中的一种: <script type="text/jav ...
- 解决Ubuntu下使用命令行subl 打开Sublime text3无法输入中文的问题
cd /opt/sublime_text/ sudo vim sub-fcitx.c 新建文件sub-fcitx.c,建议放在Sublime Text的所在目录下,将下面的代码复制进去 ,参考: ht ...
- seaborn分类数据可视化
转载:https://cloud.tencent.com/developer/article/1178368 seaborn针对分类型的数据有专门的可视化函数,这些函数可大致分为三种: 分类数据散点图 ...
- sorted()&enumerate()
d = {1:2,3:1,44:5,4:5,7:8}l = d.items() #转换为列表print(l) # dict_items([(1, 2), (3, 1), (44, 5), (4, 5 ...
- django中使用Form组件
内容: 1.Form组件介绍 2.Form组件常用字段 3.Form组件校验功能 4.Form组件内置正则校验 参考:https://www.cnblogs.com/liwenzhou/p/87478 ...
- tomcat原理分析与简单实现
tomcat原理分析与简单实现 https://blog.csdn.net/u014795347/article/details/52328221 2016年08月26日 14:48:18 卫卫羊习习 ...
- 查看虚拟机CENTOS7 的 IP 地址和命令
用于生产环境下 安装CENTOS7 太费时间, 研究阶段 放在虚拟机里面 是最好的选择: 但是安装完毕后 就出现问题 无法使用IFCONFIG : 毕竟 内核不一样 首先我们登录操作系统 用 ...
- 5. window.location.href/replace/reload()--页面跳转+替换+刷新
1.window.location=url; window.location 对象用于获得当前页面的地址 (URL),并把浏览器重定向到新的页面. 一.最外层top跳转页面,适合用于iframe框架集 ...
- leetcode404
/** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...