1.2OpenCV如何扫描图像,利用查找表和计时
查找表
颜色缩减法:如果矩阵元素存储的是单通道像素,使用C或C++的无符号字符类型,那么像素可有256个不同值。
但若是三通道图像,这种存储格式的颜色数就太多了(确切地说,有一千六百多万种)。用如此之多的颜色可能
会对我们的算法性能造成严重影响。其实有时候,仅用这些颜色的一小部分,就足以达到同样效果。
这种情况下,一种常用的做法是,颜色空间缩减,将现有颜色空间值除以某个值,以获得较少的颜色数。
Inew=(Iold/10)*10
简单的颜色空间缩减可由下面两部分组成:1.遍历图像矩阵的每一个像素 2.对像素应用上述公式。 在这个过程中
用到了乘法和除法,而这两种运算又特别费时,所以应尽可能用代价较低的加减或赋值替代。这时,可以预先计
算出所有可能的值,然后需要这些值的时候,利用查找表赋值即可。查找表是一维或多维数组,存储了不同输入
值所对应的输出值,其优势在于只需读取、无需计算。
void CreateLookupTable(uchar* table, uchar divideWith) {
for (int i = 0; i < 256; i++) {
table[i] = (i / divideWith)*divideWith;
}
}
图像扫描
1.Efficient Way
Mat& ScanImageAndReduceC(Mat& I, const uchar* table) {
//检测只能为uchar类型
CV_Assert(I.depth() != sizeof(uchar));
int channels = I.channels();
int nRows = I.rows*channels;
int nCols = I.cols;
if (I.isContinuous()) {
nCols*= nRows;
nRows = 1;
}
int i, j;
uchar *p;
for (i = 0; i < nRows; ++i) {
p = I.ptr<uchar>(i);
for (j = 0; j < nCols; ++j) {
p[j] = table[p[j]];
}
}
return I;
}
这里p是图像矩阵的第i行指针,p[j]即是图像的第i行第j列的像素值。获取每一行开始处指针,然后遍历至行末,
如果矩阵是连续存储的,只需请求一次指针然后一路遍历下去。
2.The Iterator Method
获取图像的Begin和End然后增加迭代,直至从begin到end。
Mat& ScanImageAndReduceIterator(Mat& I, const uchar* table) {
CV_Assert(I.depth() != sizeof(uchar));
const int channels = I.channels();
switch (channels) {
case 1: {
MatIterator_<uchar>it, end;
for (it = I.begin<uchar>(), end = I.end<uchar>(); it != end; ++it) {
*it = table[*it];
}
break;
}
case 3: {
MatIterator_<Vec3b>it, end;
for (it = I.begin<Vec3b>(), end = I.end<Vec3b>(); it != end; ++it) {
(*it)[0] = table[(*it)[0]];
(*it)[1] = table[(*it)[1]];
(*it)[2] = table[(*it)[2]];
}
}
}
return I;
}
对于彩色图像中的一行,每一列中有三个uchar元素,这可以认为是一个小的包含uchar元素的vector。在openCV中用Vec3b来命名。
如果要访问第n的子列,只需用简单的[]操作就可以。需要指出的是,OpenCV的迭代在扫描过一行中所有列后会自动跳至下一行,所以
说如果在彩色图像中如果只使用一个简单的 uchar 而不是 Vec3b 迭代的话就只能获得蓝色通道(B)里的值。
3.通过相关返回值的On-the-fly地址计算
这个方法本身用户获取或更改图像中的随机元素。它的基本用途是要确定你试图访问的元素的所在行数与列数。需要自己制定好所要查
找的元素的数据类型。
1.2OpenCV如何扫描图像,利用查找表和计时的更多相关文章
- OpenCV学习笔记:如何扫描图像、利用查找表和计时
目的 我们将探索以下问题的答案: 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 这里我们测试的,是一种简单的 ...
- day-15 用opencv怎么扫描图像,利用查找表和计时
一.本节知识预览 1. 怎样遍历图像的每一个像素点? 2. opencv图像矩阵怎么被存储的? 3. 怎样衡量我们算法的性能? 4. 什么是查表,为什么要使用它们? 二.什么是查表,为什么要使 ...
- OpenCV从入门到放弃系列之——如何扫描图像、利用查找表和计时
目的 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 颜色空间缩减.具体做法就是:将现有颜色空间值除以某个输入 ...
- 利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨
1.使用matlab制作.coe文件 查找表的构造 构造256点的正余弦表 exp(-j*2*pi*(0:255)/256),分别得到 cos和sin的查找表 matlab代码: 求sin fid = ...
- opencv:图像查找表 与 颜色表
LUT 使用 颜色查找表 example LUT applyColorMap // 读入制作好的lut.png Mat color = imread("D:/images/lut.png&q ...
- 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找
今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...
- OpenCV基础篇之查找表
程序及分析 /* * FileName : lookup_table.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Su ...
- C语言数据结构基础学习笔记——静态查找表
查找:在数据集合中寻找满足某种条件的数据元素的过程称为查找. 查找表:用于查找的数据集合称为查找表,一般有以下操作:①查找是否在表中:②查找属性:③进行操作. 查找表又分为: ①静态查找表:只可以进行 ...
- [20170623]利用传输表空间恢复部分数据.txt
[20170623]利用传输表空间恢复部分数据.txt --//昨天我测试使用传输表空间+dblink,上午补充测试发现表空间设置只读才能执行impdp导入原数据,这个也很好理解.--//这样的操作模 ...
随机推荐
- Shell教程 之传递参数
1.Shell传递参数 我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字, 0 为执行的文件名,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数 ...
- fbx模型加载的材质球路径
选择Location为外部加载时,会通过搜索来读取外部文件 From Model's Material 搜索项目中Materials文件 [ModelName].mat 会优先搜索当前子文件夹有没有 ...
- IntelliJ+Maven+Spring+Tomcat项目搭建(MAC)
1.新建项目 打开idea,通过File->new->project,会弹出如下的信息: 接下来点击下一步,创建项目,点击“下一步”: 选择默认的Maven以及setting文件,点击“下 ...
- 一分钟了解mongodb(转)
mongo的由来 截取自英文俚语humongous,意为”巨大的”,是否表明mongodb在设计之初就是为大数据量处理而生呢? mongodb是个啥 mongodb是个可扩展.高性能.开源.面向文档( ...
- android 下拉刷新框架PullToRefreshScrollView(com.handmark.pulltorefresh)
很简单,实现OnRefreshListener这个监听器. mPullRefreshScrollView .setOnRefreshListener(new OnRefreshListener< ...
- Ubuntu下ClickHouse安装
ClickHouse目前仅支持在ubuntu下面部署,而且国内中国文档也比较少 >vi /etc/apt/sources.list #在最后一行追加 #ubuntu16.04 使用Xenial: ...
- PHP的多进程--防止僵尸进程(转)
原文地址:http://twei.site/2017/08/08/PHP%E7%9A%84%E5%A4%9A%E8%BF%9B%E7%A8%8B-%E9%98%B2%E6%AD%A2%E5%83%B5 ...
- Dockerfile里指定执行命令用ENTRYPOING和用CMD有何不同?
结论:运行时机不太一样. RUN是在Build时运行的,先于CMD和ENTRYPOINT.Build完成了,RUN也运行完成后,再运行CMD或者ENTRYPOINT. ENTRYPOINT和CMD的不 ...
- Bundle Adjustment---即最小化重投影误差(高翔slam---第七讲)
一.历史由来 Adjustment computation最早是由geodesy的人搞出来的.19世纪中期的时候,geodetics的学者就开始研究large scale triangulations ...
- go语言中的文件创建,写入,读取,删除
package main; import ( "os" "fmt" "strconv" ) func main() { //打开文件,返回文 ...