【问题标题】:How to find border of object represent in matrix ( coordinate system)如何在矩阵(坐标系)中找到对象表示的边界
【发布时间】:2013-08-05 14:12:38
【问题描述】:

我在矩阵中有一个对象的足迹,简而言之,该对象确实占据了哪些单元格(对象是一个部分,标记为 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 

【问题讨论】:

    标签: c++ algorithm


    【解决方案1】:

    如果一个像素的所有相邻像素都是 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;
        }
      }
    }
    

    【讨论】:

      【解决方案2】:
      1. 首先,找到对象。可以使用flood fill 来完成。
      2. (1) 中找到的所有单元格都是候选单元格,遍历所有候选单元格并产生具有一个或多个相邻单元格且值为 0 的单元格。 (或者如果它在矩阵的边缘)

      一种可能的优化方法是仅“探索”具有相邻单元格且矩阵边缘为 0 的单元格。

      【讨论】:

        【解决方案3】:

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

        0 0
        0 0
        

        -> 你仍然需要找到对象的边缘。移动两步到 正确的;如果碰到右边缘,请向下移动两步,然后全部 向左的路(一种行扫描)。

        0 0
        0 1
        

        -> 向右移动一步。

        0 0
        1 1
        

        -> 向右移动一步。

        0 0
        1 0
        

        -> 下移一步。

        0 1
        0 1
        

        -> 上移一步。

        0 1
        1 1
        

        -> 上移一步。

        等等

        你这样沿着边缘顺时针移动。你遇到的任何1都可以 被视为物体的边缘部分;虽然你可以治疗 上面最后一个示例中的右下角 1 不是边缘(即 定义问题)。

        一碰到第一次击球的位置就完成了 边缘。

        注意以下角落案例,可能需要特殊处理 治疗(例如,记得曾经遇到过):

        0 1
        1 0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-17
          • 2019-09-30
          • 1970-01-01
          • 1970-01-01
          • 2016-03-27
          • 2021-04-09
          • 1970-01-01
          • 2015-05-14
          相关资源
          最近更新 更多