如何在矩阵(坐标系)中找到对象表示的边界
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
【讨论】:
以上是关于如何在矩阵(坐标系)中找到对象表示的边界的主要内容,如果未能解决你的问题,请参考以下文章