如何在矩阵中找到对象的边界(坐标系)

时间:2013-08-05 14:12:38

标签: c++ algorithm

我在矩阵中有一个对象的足迹,简而言之就是对象占据的单元格(对象是一部分,标记为0的单元格未被占用,标记为1的单元格被对象占据)。然后,我在list<pair<int, int> >中有一个带有矩阵坐标的被占用单元格列表。

如何查找属于该对象的该对象的所有边界单元格? (相邻的单元格例如是(x1, y1)(x2, y2) if abs(x1-x2)<=1 && abs(y1-y2)<=1)。

0  0  0  0  0
0  0  1  1  0 
0  1  1  1  0 
0  1  1  1  0
0  0  1  0  0 

3 个答案:

答案 0 :(得分:5)

如果所有相邻像素均为1,则将像素设置为0.其余1位于边界上:

for (x = 1; x < width-1; ++x) {
  for (y = 1; y < height-1; ++y) {
    if (data(x+1,y) && data(x-1,y) && data(x,y+1) && data(x,y-1)) {
      data(x,y) = 0;
    }
  }
}

答案 1 :(得分:2)

  1. 首先,找到对象。可以使用flood fill
  2. 来完成
  3. 在(1)中找到的所有细胞都是候选者,遍历所有候选者并产生具有值= 0的一个或多个相邻细胞的细胞。 (或者如果它在矩阵的边缘)

  4. 可能的优化是“仅”探索具有0 /边缘矩阵的相邻单元格的单元格。

答案 2 :(得分:1)

使用边缘行走:定义一个2x2单元格的窗口并从某处开始 在物体外面,例如在左上角。然后,移动 根据窗口内看到的图案左右窗口:

0 0
0 0

- &GT;您仍然必须找到对象的边缘。移动两步到    正确的;如果击中右边缘,则向下移动两步    到左边的路(一种行扫描)。

0 0
0 1

- &GT;向右移动一步。

0 0
1 1

- &GT;向右移动一步。

0 0
1 0

- &GT;向下移动一步。

0 1
0 1

- &GT;向上移动一步。

0 1
1 1

- &GT;向上移动一步。

以这种方式顺时针绕边缘移动。你遇到的任何1都可以 被视为对象的边缘部分;虽然你可以治疗 在上面最后一个例子中右下角1不是边缘(即a 定义问题)。

一旦遇到首次击中的位置,就会立即完成 边缘。

注意以下角落情况,这可能需要特殊 治疗(例如记住遇到过它):

0 1
1 0