我在矩阵中有一个对象的足迹,简而言之就是对象占据的单元格(对象是一部分,标记为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
答案 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)
可能的优化是“仅”探索具有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