如何基于二维数组裁剪图像

时间:2013-10-03 12:16:31

标签: java multidimensional-array

假设我有一个基于2d数组坐标的图像,如下所示:

{
        { ' ', ' ', ' ', ' ' }, 
        { ' ', ' ', 'x', ' ' }, 
        { ' ', 'x', ' ', ' ' }, 
        { ' ', 'x', 'x', ' ' }
};

想将它裁剪成更小的数组:

{
        { ' ', 'x' }, 
        { 'x', ' ' }, 
        { 'x', 'x' }
};

我该怎么做?有什么想法吗?

1 个答案:

答案 0 :(得分:1)

迭代一次数组。

在迭代时,找到left列(x第一次出现的列)和最right列(x上次出现的列) )。两行相同:一行top,一行bottom。这4行为您的图像提供了界限。

              left right
        { ' ', ' ', ' ', ' ' }, 
 top    { ' ', ' ', 'x', ' ' }, 
        { ' ', 'x', ' ', ' ' }, 
 bottom { ' ', 'x', 'x', ' ' }

伪代码:

int left = INT_MAX, right = -1, top = INT_MAX, bottom = -1
for (int y = 0; y < Y; y++)
  for (int x = 0; x < X; x++)
    if (t[x][y] == 'x')
    {
      if (left > x) left = x
      if (right < x) right = x
      if (top > y) top = y
      bottom = y // we don't need if! :)
    }

根据您的输入示例,它将生成此类索引:

left   == 1
right  == 2
top    == 1
bottom == 3

使用包含该边界的子矩阵将给出您的示例性输出图像。