查找表

颜色缩减法:如果矩阵元素存储的是单通道像素,使用C或C++的无符号字符类型,那么像素可有256个不同值。

但若是三通道图像,这种存储格式的颜色数就太多了(确切地说,有一千六百多万种)。用如此之多的颜色可能

会对我们的算法性能造成严重影响。其实有时候,仅用这些颜色的一小部分,就足以达到同样效果。

这种情况下,一种常用的做法是,颜色空间缩减,将现有颜色空间值除以某个值,以获得较少的颜色数。

Inew=(Iold/10)*10

简单的颜色空间缩减可由下面两部分组成:1.遍历图像矩阵的每一个像素 2.对像素应用上述公式。 在这个过程中

用到了乘法和除法,而这两种运算又特别费时,所以应尽可能用代价较低的加减或赋值替代。这时,可以预先计

算出所有可能的值,然后需要这些值的时候,利用查找表赋值即可。查找表是一维或多维数组,存储了不同输入

值所对应的输出值,其优势在于只需读取、无需计算。

  1. void CreateLookupTable(uchar* table, uchar divideWith) {
  2. for (int i = 0; i < 256; i++) {
  3. table[i] = (i / divideWith)*divideWith;
  4. }
  5. }

  

图像扫描

1.Efficient Way

  1. Mat& ScanImageAndReduceC(Mat& I, const uchar* table) {
  2. //检测只能为uchar类型
  3. CV_Assert(I.depth() != sizeof(uchar));
  4. int channels = I.channels();
  5.  
  6. int nRows = I.rows*channels;
  7. int nCols = I.cols;
  8. if (I.isContinuous()) {
  9. nCols*= nRows;
  10. nRows = 1;
  11. }
  12. int i, j;
  13. uchar *p;
  14. for (i = 0; i < nRows; ++i) {
  15. p = I.ptr<uchar>(i);
  16. for (j = 0; j < nCols; ++j) {
  17. p[j] = table[p[j]];
  18. }
  19. }
  20. return I;
  21. }

  这里p是图像矩阵的第i行指针,p[j]即是图像的第i行第j列的像素值。获取每一行开始处指针,然后遍历至行末,

如果矩阵是连续存储的,只需请求一次指针然后一路遍历下去。

2.The Iterator Method

获取图像的Begin和End然后增加迭代,直至从begin到end。

  1. Mat& ScanImageAndReduceIterator(Mat& I, const uchar* table) {
  2. CV_Assert(I.depth() != sizeof(uchar));
  3. const int channels = I.channels();
  4. switch (channels) {
  5. case 1: {
  6. MatIterator_<uchar>it, end;
  7. for (it = I.begin<uchar>(), end = I.end<uchar>(); it != end; ++it) {
  8. *it = table[*it];
  9. }
  10. break;
  11. }
  12. case 3: {
  13. MatIterator_<Vec3b>it, end;
  14. for (it = I.begin<Vec3b>(), end = I.end<Vec3b>(); it != end; ++it) {
  15. (*it)[0] = table[(*it)[0]];
  16. (*it)[1] = table[(*it)[1]];
  17. (*it)[2] = table[(*it)[2]];
  18. }
  19. }
  20. }
  21. return I;
  22. }

  对于彩色图像中的一行,每一列中有三个uchar元素,这可以认为是一个小的包含uchar元素的vector。在openCV中用Vec3b来命名。

如果要访问第n的子列,只需用简单的[]操作就可以。需要指出的是,OpenCV的迭代在扫描过一行中所有列后会自动跳至下一行,所以

说如果在彩色图像中如果只使用一个简单的 uchar 而不是 Vec3b 迭代的话就只能获得蓝色通道(B)里的值。

3.通过相关返回值的On-the-fly地址计算

这个方法本身用户获取或更改图像中的随机元素。它的基本用途是要确定你试图访问的元素的所在行数与列数。需要自己制定好所要查

找的元素的数据类型。

1.2OpenCV如何扫描图像,利用查找表和计时的更多相关文章

  1. OpenCV学习笔记:如何扫描图像、利用查找表和计时

    目的 我们将探索以下问题的答案: 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 这里我们测试的,是一种简单的 ...

  2. day-15 用opencv怎么扫描图像,利用查找表和计时

    一.本节知识预览 1.  怎样遍历图像的每一个像素点? 2.  opencv图像矩阵怎么被存储的? 3.  怎样衡量我们算法的性能? 4.  什么是查表,为什么要使用它们? 二.什么是查表,为什么要使 ...

  3. OpenCV从入门到放弃系列之——如何扫描图像、利用查找表和计时

    目的 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 颜色空间缩减.具体做法就是:将现有颜色空间值除以某个输入 ...

  4. 利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨

    1.使用matlab制作.coe文件 查找表的构造 构造256点的正余弦表 exp(-j*2*pi*(0:255)/256),分别得到 cos和sin的查找表 matlab代码: 求sin fid = ...

  5. opencv:图像查找表 与 颜色表

    LUT 使用 颜色查找表 example LUT applyColorMap // 读入制作好的lut.png Mat color = imread("D:/images/lut.png&q ...

  6. 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

    今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...

  7. OpenCV基础篇之查找表

    程序及分析 /* * FileName : lookup_table.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Su ...

  8. C语言数据结构基础学习笔记——静态查找表

    查找:在数据集合中寻找满足某种条件的数据元素的过程称为查找. 查找表:用于查找的数据集合称为查找表,一般有以下操作:①查找是否在表中:②查找属性:③进行操作. 查找表又分为: ①静态查找表:只可以进行 ...

  9. [20170623]利用传输表空间恢复部分数据.txt

    [20170623]利用传输表空间恢复部分数据.txt --//昨天我测试使用传输表空间+dblink,上午补充测试发现表空间设置只读才能执行impdp导入原数据,这个也很好理解.--//这样的操作模 ...

随机推荐

  1. 给自己的博客上添加个flash宠物插件

    前言 最近在一些博主的博客上看到一些小宠物的挂件,很有趣,访客到了网站后可以耍耍小宠物,增加网站的趣味性,在功能强大的博客系统上看到有这样的小宠物挂件还是蛮有趣的. 正文 下面就简单介绍下如何在博客园 ...

  2. POJ 1177 Picture(线段树周长并)

      描述 A number of rectangular posters, photographs and other pictures of the same shape are pasted on ...

  3. 项目总结14:Windows远程连接redis(cmd指令或PowerShell指令)

    1-确认远程的redis服务器是否允许被远程连接,已redis server安装在阿里云ECS上为例 1-1-确认在阿里云控制台,开放了端口6379和允许访问的IP 1-2-确认在服务器上安装redi ...

  4. js常用的数组,,字符串,,Math..正则方法

    数组 slice[start,end] 返回从原数组中指定开始下标到结束下标之间的项目组成新数组(不会影响原数组) splice() 1.删除功能:2个参数 , 起始位置 , 删除的项目 2.插入功能 ...

  5. java_12多态

    1多态概述 多态是继封装.继承之后,面向对象的第三大特性. 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样 ...

  6. c# 关于字典dictionary 按时间排序

    上文中说到sortedlist 排序是键排序,不符合项目要求问题,接着使用字典dictionary 对value 为时间按照升序排序,问题解决.中间涉及到linq的使用.还有其他的写法,但发现下边的写 ...

  7. 三分钟分布式CAP理论

    分布式系统架构理论,定义了三种指标,理论说我们最多只能满足两个. ## 分布式系统 首先我们这个理论所说的分布式系统,是指系统内会共享数据,互相有连接有交互,才能完成系统功能的的分布式系统.而这个理论 ...

  8. BZOJ2721或洛谷1445 [Violet]樱花

    BZOJ原题链接 洛谷原题链接 其实推导很简单,只不过我太菜了想不到...又双叒叕去看题解 简单写下推导过程. 原方程:\[\dfrac{1}{x} + \dfrac{1}{y} = \dfrac{1 ...

  9. 一种基于URL数据源的WEB报表插件

    完全支持所见所得的报表设计, 支持 PHP ,Java 等所有支持JSON格式的后端. 立即下载测试版本 需要正式版本?请QQ联系:1565498246 或者留言

  10. How to Set Ckeditor ReadOnly Mode

    CKEditor API makes it possible to render the editor content read-only (and thus impossible for the u ...