如何对占用网格进行降采样?

时间:2019-03-06 01:13:35

标签: c++ algorithm

我有一个以行为主的矢量形式存储的占用网格。假设细胞是用数字来表示的

v = [1, 2, 3, ...... , width * height ]

其中宽度和高度是占用栅格的尺寸

0  1  2  3  4  5
6  7  8  9  10 11
12 13 14 15 16 17
18 19 20 21 22 23
24 25 26 27 28 29
30 31 32 33 34 35

如果我们有一个6 x 6的占用网格。

我现在想做的是将6 x 6的占用网格降采样为2 x 2(或3 x 3)的占用网格。这样做的方法是分别检查以下几组单元格:

0  1  2 
6  7  8 
12 13 14 

3  4  5
9  10 11
15 16 17

18  19  20
24  25  26
30  31  32

21  22  23
27  28  29
33  34  35

,如果单个组中的任何单元都被占用,则 下采样网格中的新单元也将被占用。因此,我获得以下占用网格,其中单元格1,2,3,4的占用率由上方

的4组单元格确定
1  2
3  4

如何在C ++中编写for循环以完成任意大小的网格的上述工作?我设法弄清楚的唯一模式是,每行上第一个元素的索引是i * width,其中i是行号

1 个答案:

答案 0 :(得分:0)

这里重要的事情可能是2D到1D映射:

idx = x + width * y

有了这个,我们便可以进行下采样:

input:
    originalOccupancy[]
    originalWidth, originalHeight
    newWidth, newHeight

int downsampleFactorX = originalWidth / newWidth;
int downsampleFactorY = originalHeight / newHeight;

for(int y = 0; y < newHeight; ++y)
{
    for(int x = 0; x < newWidth; ++x)
    {
        int bool occupied = false;
        //now check all the relevant original cells
        for(int oy = 0; oy < downsampleFactorY; ++oy)
        {
            int originalRowStartIdx = (y * downsampleFactorY + oy) * originalWidth + x * downsampleFactorX;
            for(int ox = 0; ox < downsampleFactorX; ++ox)                
                occupied = occupied || originalOccupancy[originalRowStartIdx + ox];
        }
        newOccupancy[x + y * newWidth] = occupied;
    }
}