小白,入门中,不足其指正。刚刚接触opencv,从一个Matlab风格的编程环境突然跳转到C++,实在有些不适。单就pixels scanning花了好长时间研究。opencv-tutorials给出了四种方法。这里将比较其中最高效的方法与Mat类里定义的at()的效率。

本文以opencv-tutorials中给出的color reduction 为例进行比较。

图像的读取

为了简化问题,直接对灰度图进行操作,灰度图的获取可以用Mat类里的imread函数(每每看到这个函数都很激动,又有了Matlab的感觉)。

//read the image data

Mat GrayImage;

GrayImage = imread("test.jpg",);

//show the image that read

namedWindow("OriginalGrayImage");

imshow("OriginalGrayImage",GrayImage);

其中imread的参数0表示的就是读取灰度图。相比于Matlab里面还要用rgb22gray转化,这里就方便一点了哈!

原图:

灰度读取效果:

lookup table的产生

我们的目的是把读取的图像像素值进行量化,如果将0~255的像素量化成4级,就需将0~63的像素计算成0,64~127的像素计算成为64……

因为在C++编译过程中,uchar/int的结果还是uchar,所以直接利用下面公式就可以得到

注意的是这里我用的是opencv.org上盗的图,图中的10可以用dividewidth替换,dividewidth的值需要根据量化的结果来确定,比如如果dividewidth=64;那么0~63的像素都会计算成0,64~127的像素都会计算成为64……以此类推,这样就会被量化成4级。

但是值得注意的是,对于一张100*100的灰度图就需要计算10000次,所以lookup table产生了。lookup table的思路是产生一个0~255的向量,没个存放用上述公式计算的结果,然后遍历的时候只需要查表就可以了,这样对于一个100*100的灰度图,本来需要计算10000次的,现在只需要计算256次。

产生lookup table的代码段

uchar table[];

int div = ;

for(int i=;i

table[i] = (uchar)(div*(i/div));

灰度量化-classic C style operator[]

Mat.ptr(i)可以获得第i行的指针,其中type表示的是Mat中存放的数据类型,一般的灰度图为uchar,rgb图则是Vec3b。Mat.rows和Mat.cols中分别存放的是图像的行数和列数。

具体代码段如下

//get some informations from GrayImage

int nr = GrayImage.rows;

int nc = GrayImage.cols;

uchar* p;

for(int i=0;i

{

p = GrayImage.ptr(i);

for(int j=0;j

{

p[j] = table[p[j]];

}

}

运行结果:

灰度量化-Mat.at(i,j)

Mat类里定义的at函数可以直接访问图像中的像素。其中type参见上一条的解释。(i,j)为图像中的坐标。

具体代码段如下:

for(int i=;i

for(int j=;j

GrayImage.at(i,j) = table[GrayImage.at(i,j)];

运行结果:

如何获得运行时间

opencv中提供了两个函数,getTickCount()和getTickFrequency();

opencv.org盗来的代码段:

double t = (double)getTickCount();

// do something ...

t = ((double)getTickCount() - t)/getTickFrequency();

cout << "Times passed in seconds: " << t << endl;

结果比较

运行环境:

OS: Windows 10-64bit

IDE: codeblocks 13.12 with g++

CPU: i3

内存: 4GB

运行结果:

classic C style operator[]

0.00136458

Mat.at(i,j)

0.00498963

从结果可以看出,指针操作明显更高效,这也就是为什么opencv-tutorials中把它称为the effective way的原因。但是,指针操作有危险性,所以很多人还是原因用Mat.at的方法。

Python中两种处理错误方法的比较

我所说的处理错误的方法,其实是try:,except和raise这两种. 首先抛出一个实例, dictt={'a':1,'b':2,'c':3} try: if dictt['d']>1: #字 ...

UWP开发中两种网络图片缓存方法

通常情况下,我们的程序需要从服务器读取图片,但如果需要不止一次读取某一张图片的话,就需要做本地缓存了,这样既为用户省一点流量,又能显得你的APP很快. 假如你已经知道了某一张图片的地址,那么第一件事就 ...

Cesium 中两种添加 model 方法的区别

概述 Cesium 中包含两种添加 model 的方法,分别为: 通过 viewer.entities.add() 函数添加 通过 viewer.scene.primitives.add() 函数添加 ...

JAVA 中两种判断输入的是否是数字的方法&lowbar;&lowbar;正则化&lowbar;

JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...

JavaScript 中的12种循环遍历方法

原文:JavaScript 中的12种循环遍历方法 题目:请介绍 JavaScript 中有哪些循环和遍历的方法,说说它们的应用场景和优缺点? 1.for 循环 let arr = [1,2,3];f ...

jsp中两种include的区别【转】

引用文章:http://www.ibm.com/developerworks/cn/java/j-jsp04293/ http://www.cnblogs.com/lazycoding/archive ...

OC中两种单例实现方式

OC中两种单例实现方式 写在前面 前两天探索了一下C++ 的单例,领悟深刻了许多.今天来看看OC中的单例又是怎么回事.查看相关资料,发现在OC中一般有两种实现单例的方式,一种方式是跟C++ 中类似的常 ...

关于js中两种定时器的设置及清除(转载)

1.JS中的定时器有两种: window.setTimeout([function],[interval]) 设置一个定时器,并且设定了一个等待的时间[interval],当到达时间后,执行对应的方法 ...

GET和POST两种基本请求方法&lpar;转自博主--在途中&num;&rpar;

GET和POST两种基本请求方法的区别 GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过req ...

随机推荐

打造android偷懒神器———ListView的万能适配器

如果你去做任何一个项目,我相信你都会跟我有一样的经历,最最普遍的就是列表显示ListView,当然,写N个自定义的适配器也是情理之中.虽说程序员本身就是搬砖,做这些枯燥无味的重复的事情也是理所当然,但 ...

jQuery插件制作方法

html页面:

Hello My name is Alex,i from china.

1.无参数实现文字阴影效果 测试代码: $("h1" ...

H5实现俄罗斯方块(二)

对应的js 1.封装操作dom的js: (function (document) { //游戏的实例 var gameInst; /**封装一个返回原型的DOM对象 */ function DomOb ...

centos 升级GCC&sol;G&plus;&plus;

#get rep yum install centos-release-scl-rh #yum install centos-release-scl # install g++ 5.2.1 yum - ...

通过EL表达式,后台数据传到前台,引号及后面的数据被截断的问题:

问题描述: 通过EL表达式,后台数据传到前台,引号及后面的数据被截断的问题: 如: 前端页面: html: 问题解决: 1.一个简单的办法,把 input 写成这样:

Tensorflow 神经网络

Tensorflow让神经网络自动创造音乐 前几天看到一个有意思的分享,大意是讲如何用Tensorflow教神经网络自动创造音乐.听起来好好玩有木有!作为一个Coldplay死忠粉,第一想法就是自动生 ...

Properties读取属性文件

import java.util.*;import java.io.*;class PropertiesDemo{ public static void main(String[] args) thr ...

js中判断数组中是否含有某个字符串方法

1.两个数组间互相校验 Var  inArray = function(arr, item) { for(var i = 0; i < arr.length; i++) { if(arr[i] ...

Understanding HBase and BigTable

Hbase is a distributed data storage systems. A Bigtable is spare , distributed , persistent multidim ...

kafka AdminClient 闲时关闭连接

AdminClient 类提供了创建.删除 topic 的 api. 在项目中创建了一个 AdminClient 对象,每次创建 topic 时,调用 org.apache.kafka.clients ...

matlab 遍历每个像素点,Mat中两种像素遍历方法比较相关推荐

  1. R中两种常用并行方法——2. snowfall

    上一篇博客(R中两种常用并行方法--1. parallel)中已经介绍了R中常见的一种并行包:parallel,其有着简单便捷等优势,其实缺点也是非常明显,就是很不稳定.很多时候我们将大量的计算任务挂 ...

  2. Cesium 中两种添加 model 方法的区别

    概述 Cesium 中包含两种添加 model 的方法,分别为: 通过 viewer.entities.add() 函数添加 通过 viewer.scene.primitives.add() 函数添加 ...

  3. python列表去重函数_对python中两种列表元素去重函数性能的比较方法

    测试函数: 第一种:list的set函数 第二种:{}.fromkeys().keys() 测试代码: #!/usr/bin/python #-*- coding:utf-8 -*- import t ...

  4. 函数指针--Nginx和Redis中两种回调函数写法

    1.Nginx和Redis中两种回调函数写法 #include <stdio.h>//仿Nginx风格 //结构外声明函数指针类型 typedef void (*ngx_connectio ...

  5. spring mvc中两种异常的处理手法

    spring mvc中两种异常的处理手法 在spring mvc中,对异常的处理,可以小结有如下两类写法: 1 <bean id="exceptionResolver" cl ...

  6. java : enum、创建文件和文件夹、删除文件和文件夹、获得项目绝对路径、写入数据到excel中、java代码中两种路径符号写法、读取、写入text文件...

    java : enum http://www.cnblogs.com/hyl8218/p/5088287.html 创建文件和文件夹.删除文件和文件夹 http://www.cnblogs.com/m ...

  7. unity3d软阴影和硬阴影的原理_Unity3D中两种默认阴影的实现

    Unity3D中两种阴影的实现 传统的ShadowMap ShadowMap说起来十分简单,把摄像机和光源的位置重叠,那么场景中该光源的阴影区域就是那些摄像机看不到的地方,主要应用在前向渲染路径中. ...

  8. apache php 工作模式,PHP Apache中两种工作方式区别(CGI模式、Apache 模块DLL)

    搜索热词 对PHP在Apache中两种工作方式的区别(CGI模式.Apache 模块DLL)感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! Windows 下有两种方法使 ...

  9. Word 2003中打开最近操作过的文档的两种推荐的方法

    本文介绍Word 2003中打开最近操作过的文档的两种推荐的方法. 注:我的系统为WINDOWS 7,与XP下基本一致. 方法1: 在WINDOWS 7下,点击任务栏上的WINDOWS图标(即&quo ...

最新文章

  1. 王爽著的《汇编语言》第3版笔记
  2. Python 字符串转义序列及格式化
  3. java中的model_Java程序员必看之springmvc中的Model对象在重定向中的数据
  4. 动静分离-静态资源缓存控制
  5. 安卓修改wifi已停用_手机连不上wifi显示已保存怎么回事【原因介绍】
  6. 人工蜂群算法python_教程 | 用人工蜂群算法求解k-分区聚类问题
  7. SAP自学指南:案例公司的SAP实现(一)
  8. R-Sys.time计算程序运行时间
  9. kudu导入文件(基于impala)
  10. 图解50道sql编写题
  11. matlab a1处语法无效,MATLAB常见错误
  12. vue结合element 输入框输入纯数字以及限制输入小数
  13. Signal to Noise Ratio——信噪比
  14. MySQL GROUP_CONCAT()函数的排序方法
  15. 手机订货系统的基本原理 帮助经销商卖货
  16. java校招笔试题目_Java校招笔试题
  17. c语言采集西门子PLC数据,西门子PLC数据采集
  18. 危骆邦油邦快讯|山东地炼报价行情早知道
  19. struts2漏洞监测_全版本struts2漏洞练习
  20. 《Linux运维实战:使用Percona XtraBackup物理备份与恢复Mysql数据》

热门文章

  1. Hive 到底有什么用?
  2. 红米Note 4超简单刷成开发版获取ROOT权限的流程
  3. 网站调用在线二维码生成 api
  4. 数字化和全链信息化助力服装供应链智能化发展
  5. SOCKET的 10035错误
  6. js实现instanceof+实现原理
  7. Java基础知识每日总结(19)---Java输入输出流、文件、递归
  8. 云服务器建网站(安装Java与Tomcat)
  9. linux运行国服英雄联盟排行榜,LOL国服排位十大高手排名:问谁是S2路人王
  10. 关于S32K汽车通用MCU,NXP工程师总结的10个超实用Tips