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

Posted

技术标签:

【中文标题】如何在矩阵(坐标系)中找到对象表示的边界【英文标题】: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 

【问题讨论】:

【参考方案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】:
    首先,找到对象。可以使用flood fill 来完成。 (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

【讨论】:

以上是关于如何在矩阵(坐标系)中找到对象表示的边界的主要内容,如果未能解决你的问题,请参考以下文章

从模型矩阵或四元数中找到最终的世界坐标

如何在 Tensorflow 对象检测 API 中查找边界框坐标

查找 BW 图像边界上的坐标

如何在地理坐标中获取 WorldWind 地球的边界

从旋转的矩形计算边界框坐标

cad如何建立坐标系,cad怎么建立坐标系?