从平铺图像中对双线性样本有什么好的策略吗?

时间:2016-09-27 06:17:25

标签: c++ c image optimization

当进行图像的双线性样本时,需要4个相邻像素。这对于内存中线性的图像来说很容易。 然而,如果图像由存储器中的各个瓦片构成,则在最坏的情况下,四个样本中的每一个都在不同的瓦片中。 有什么策略可以让这个快?假设瓦片是两个正方形的幂。在大多数情况下,聚集应该保持在一个瓦片内。

瓦片指针有一个w x h阵列T,每个瓦片是k x k像素的原始阵列。如何快速收集(x,y,dest)函数,返回(x,y),(x + 1,y),(x,y + 1),(x + 1,y + 1)处的四个像素)?

如果tile不是原始指针而是可能需要被分页的对象怎么办?因此,如果(T [o] == 0)PageIn(o),则需要进行测试;

整个图像的边缘也应该夹紧,所以值(-1,y)==值(0,y)等。

这是一个非常开放的问题。我知道该怎么做。我正在寻找如何快速完成它的技巧和提示。

2 个答案:

答案 0 :(得分:2)

让你的瓷砖存储冗余像素 - 也就是说,将像素存储在两个相邻图块中的图块边界附近(如果像素靠近图块的角落,则实际存储在4个图块中)。

这完全消除了以浪费内存为代价读取像素(包括边界附近)的开销。此外,写入像素更难 - 写入单个像素可能需要更新最多4个图块。但是,如果计算整个图像,则生成冗余像素是一个统一的过程。

您可能希望为图块选择特定尺寸。例如,width = 62像素(当pixel = byte时);添加两个冗余像素后,宽度等于高速缓存行(假设它为64字节)。

如果使用双三次插值,请从每侧添加2个冗余像素。

答案 1 :(得分:0)

您始终可以预先指定指向行的指针。将它们分类为一个大的指针数组,通过访问指针数组可以到达tile扫描线

char* ptr [numTilesH][numTilesV * tileHeight];

// ... fill the pointer array with pointers to the beginning of each 
// scanline in a tile...

// ...assume 256 grey scales
unsigned char getPixel (int x, int y) {
   int hTileNr = x / tileWidth;
   int hTileOffs = x % tileWidth;

   char * pixelPtr = ptr [hTileNr][y];
   return pixelPtr [hTileOfs];
}

在这种情况下,优化是典型的内存与CPU的折价。正如您在此处所看到的,对像素的访问是具有余数的一个除法,以及两个数组访问。一旦设置了指针数组,就应该非常快。但是,你拥有的磁贴越多,扫描线指针所需的内存就越多 - 可能达到指针数组变得过于昂贵的程度。