C++ 如何在矩阵(坐标系)中找到表示对象的边界
我在矩阵中有一个对象的示意图,简而言之,就是对象占用了哪些单元格(对象是一部分,标记为0的单元格未占用,标记为1的单元格被对象占用)。然后,我在C++ 如何在矩阵(坐标系)中找到表示对象的边界,c++,algorithm,C++,Algorithm,我在矩阵中有一个对象的示意图,简而言之,就是对象占用了哪些单元格(对象是一部分,标记为0的单元格未占用,标记为1的单元格被对象占用)。然后,我在list中用矩阵坐标列出了一个被占用的单元格列表 如何找到属于该对象的该对象的所有边界单元格?(例如,如果abs(x1-x2),相邻单元为(x1,y1)和(x2,y2) 首先,找到对象。可以使用 在(1)中找到的所有单元格都是候选单元格,遍历所有候选单元格并生成具有一个或多个值为0的相邻单元格的单元格。(或者如果其位于矩阵的边缘) 一种可能的优化方法是
list
中用矩阵坐标列出了一个被占用的单元格列表
如何找到属于该对象的该对象的所有边界单元格?(例如,如果abs(x1-x2),相邻单元为(x1,y1)
和(x2,y2)
首先,找到对象。可以使用
在(1)中找到的所有单元格都是候选单元格,遍历所有候选单元格并生成具有一个或多个值为0的相邻单元格的单元格。(或者如果其位于矩阵的边缘)
一种可能的优化方法是只“探索”具有矩阵0/边的相邻单元的单元。使用边行走:定义一个2x2单元的窗口,然后从某个地方开始
在对象外部,例如在左上角。然后,移动
根据在窗口内看到的图案打开窗口:
0 0
0 0
->你仍然需要找到物体的边缘。移动两步到
右侧;如果击中右侧边缘,向下移动两步,全部
左边的方式(一种行扫描)
->向右走一步
0 0
1 1
0 0
1 0
->向右走一步
0 0
1 1
0 0
1 0
->退一步
0 1
0 1
->向前走一步
0 1
1 1
->向前走一步
0 1
1 1
等等
你沿着边缘顺时针移动。你遇到的任何一个都可以
被视为对象的边缘部分;尽管您可以将
上一个示例中的右下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;
}
}
}
(x=1;x{
对于(y=1;y<高度-1;++y){
if(数据(x+1,y)和数据(x-1,y)和数据(x,y+1)和数据(x,y-1)){
数据(x,y)=0;
}
}
}