PTAMM阅读笔记之查找表的使用(四)

来源:互联网 发布:微盘交易php源码 编辑:程序博客网 时间:2024/05/22 06:50

查找表的基础知识:

函数的计算开销很大,但是把计算结果缓存起来的开销比较小时,用查找表(简称LUTs)优化这种函数的计算是一种非常好的方法。通过预先把一些常见输入的对应结果计算出来,花费不多的查找操作就能代替开销较大的运行时计算。如果查找比从头开始计算结果(或者有不断重复的相同输入)要快,那么使用查找表就能提高程序性能。由于数据请求会落在表的样本区间中,插值算法能够通过对数值附近样本取平均值产生可以接受的近似值。

一维查找表:

查找表是以其维数来定义,即把一个输出值编入索引时所必要的索引数目。最简单的查找表是以一个变量来编制和访问的,也就是1D查找表。

考虑一种对颜色的操作f(x),作用于8位的灰度图像。一种做法就是遍历图像的所有像素,为每一个像素都计算一次f(x)的值。然而,无论这个函数有多复杂,它的计算记过都只会是255种中的一种(相应于每一种不同的输入)。因此,一种替代的方法就是列出这个运算对应于每一种输入的结果,在运行时通过查找这几个表来对像素进行变换计算。假设查找整数表是高效的,同时光栅图像的像素数目多余255个,那么使用查找表会加快速度。

PTAMM之查找表:

      unsigned int v=0;      lev.vCornerRowLUT.clear();      for(int y=0; y<lev.im.size().y; y++){  while( (v < lev.vCorners.size()) && (y > lev.vCorners[v].y) )    v++;  lev.vCornerRowLUT.push_back(v);}
上述代码实现了将角点坐标存入1D按列查找表中。首先,角点的个数是不确定的,但是im.size是有限的,因此将角点按列存储,方便后续计算中进行查询,即每一个纵坐标对应一个角点。这里查找表中存入的是角点的索引值。