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 ...
随机推荐
- java判断字符串中是否含有中文
/** * 判断字符串中是否含有中文 */ public static boolean isCNChar(String s){ boolean booleanValue = false; for(in ...
- C++基本规则
C++ 程序结构 让我们看一段简单的代码,可以输出单词 Hello World. #include <iostream> using namespace std; // main() 是程 ...
- linux 重新设置memsql密码
先登陆服务器,找到自己的my.cnf文件,通常会在 /etc目录下(如果不在,可以用find / -name my.cnf命令找一下),然后使用 vi my.cnf 命令编辑该文件(建议先备份),在[ ...
- ubuntu 14.04 lamp 安装与配置
一.安装apache 1.打开终端:Ctrl+Alt+T sudo apt-get update 2.通过apt-get方式安装Apache: sudo apt-get install apache2 ...
- php array_flip() 删除数组重复元素——大彻大悟
1. php array_flip() 删除数组重复元素,如果用于一维索引数组,好理解. [root@BG-DB:~]$more arr.php <?php $arr = ar ...
- trigger和triggerHandler的使用
今天琢磨了好久这个trigger和triggerHandler的用法.在网上搜了好多,不过大都是相互抄袭,毛意思都没有.后来自己做了研究. trigger: 1.可以用来触发事件. <input ...
- OpenGL chapter2
opengl: 图形硬件的一种软件接口:最大的优点:它的速度快于光线追踪器或软件渲染引擎. GLUT: AUX是OpenGL辅助函数库. 数据类型: GLboolean 位宽:1 GLbyte 8 G ...
- HTML5 Canvas ( 圆和切点曲线的绘制 ) arc, arcTo
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- leetcode134
class Solution { public: inline int get_next(int idx, int size) { ? : idx+; } int aux(int idx, vecto ...
- node 图片上传功能
node 代码: var http = require("http"); var express = require('express') app = express(), for ...