将2D矢量缩小为较小的2D矢量

时间:2017-01-17 21:44:04

标签: c++

我有一个大小为NxM的大型2D矢量

vector<vector<int> > grid;

我需要通过将其除以固定数字来缩小它 例如。 N = 194 M = 231需缩小7(向上舍入) 这意味着新网格的大小必须为N = 28 M = 33。

原始网格有0和1,所以我需要将数组分解为7x7块,如果所有值== 0则新网格中的单元格= 0,但如果至少有一个值是1,然后新单元格中的值必须为1.

我写了一些函数,但似乎无法得到它。 任何帮助将非常感激。

我尝试过这样的东西,我发现并试图适应

for (int i=0; i < rows - k_rows + 1; i++)
{
   for (int j=0; j < cols -k_cols + 1; j++)
   {
       int sum = 0;
       for (int p=i; p< k_rows +i; p++)
           for (int q=j; q < k_cols + j; q++)
               sum += mat[p][q];
       file << sum;
   }
   file << endl;

2 个答案:

答案 0 :(得分:2)

虽然我认为user45891是正确的,但是存在一个常见的图像处理问题。但是,这是一个非常不准确的版本。所以我不打算这样做。我写了一个完整的示例程序(~80行)。

以下是一些想法:   创建一个你想要它的大小的新矩阵,并将其初始化为false(我使用布尔值,因为你只想要0和1)。   迭代这个新的(较小的)矩阵并将每个值设置为函数的返回值,该函数搜索原始矩阵的子集1秒。

- &GT;您将通过此函数传递要搜索原始矩阵的x1,x2-&gt; y1,y2范围

- &GT;使用收缩因子计算该范围

这个新函数did_i_find_a_one(x,x2,y,y2)只返回该块中是否有1。

除了以下代码之外,我还编写了显示矩阵的函数,以便我可以看到结果。但我认为这是它的核心。我认为如果你有非常大的地图,可能会有更好的方法。但天真地说,这不会那么糟糕。

typedef unsigned int uint;
typedef vector<bool> boolvector;
typedef vector<boolvector> matrix;

void initialize( matrix &i, uint newx, uint newy ) {
  i.resize(newy);
  for( auto it = i.begin(); it != i.end(); ++it) {
    it->resize(newx,0);
  }
}

void shrink( matrix &orig, matrix &to, uint factor=10 ) {
  uint _y=orig.size();
  uint _x=orig[0].size();
  uint newy=(_y + factor - 1)/factor; //round up division
  uint newx=(_x + factor - 1)/factor;
  initialize(to, newx, newy)

  for (uint y=0; y<newy; ++y) { 
    for (uint x=0; x<newx; ++x) {
      to[y][x]=is_one_in_block(x*factor,(x+1)*factor-1,y*factor,(y+1)*factor-1);
    }
  }
}

bool is_one_in_block( matrix & _i, uint x1, uint x2, uint y1, uint y2) {
  uint _y=_i.size();
  uint _x=_i[0].size();
  if (y2>_y-1) y2=_y-1; //over max protection
  if (x2>_x-1) x2=_x-1; //over max protection
  for (uint y=y1; y<=y2; ++y)
    for (uint x=x1; x<=x2; ++x)
      if (_i[y][x])
        return true;
  }
  return false;
}

答案 1 :(得分:0)

您的问题听起来与在图像处理中使用滤镜非常相似。在这种情况下,您可以让convolution matrix(在裁剪模式下)滑过图像。

Wiki文章有示例代码,我将概述这里的一般步骤:

  1. 在x和y维度中迭代2d向量。但是不要从索引0开始 - 从shrinkFactor/2开始并迭代到.size() - shrinkFactor/2

  2. 收集卷积矩阵/块。创建一个新的1d数组并运行两个循环可能是最简单的。外部的x - shrinkFactor/2x + shrinkFactor/2,反之亦然。

    1. 测试该数组是否全为零并相应地填充输出