我有一个10x10
二进制位图,如下所示。我正在寻找一种高效的方法来在MATLAB中找到它的轮廓。 (我已经尝试过让每一个值"环顾四周"它的邻居和价值并决定,但效率太低。我希望算法能够扩大规模。)
false false false false false false false false false false
false false true true true true true true false false
false true true true true true true true true false
false true true true true true true true true false
false true true true true true true true true false
false true true true true true true true true false
false true true true true true true true true false
false true true true true true true true true false
false false true true true true true true false false
false false false false false false false false false false
假设每个布尔值类似于一个正方形,而左下角的一个布局值位于x: 0-1; y: 0-1
之上。输出应该是形成边界的点。您可以假设内部true
块始终是凸的。
答案 0 :(得分:2)
这很简单。假设您有图像处理工具箱,请在MATLAB中使用bwperim
命令。
您可以像这样调用函数:
out = bwperim(A); %//or
out = bwperim(A,conn);
第一种方式假设像素连接是一个4像素的邻域。这只会看北,南,东,西方向。
如果指定名为conn
的附加参数(单个数字),则可以覆盖此行为并指定查看相邻像素时所需的行为类型。例如,如果conn=8
,你会看到2D的8像素邻域(所以N,NE,E,SE,S,SW,W,NW),或者如果你有3D,你可以进入3D二进制图像...但是现在,我假设它只是2D。为获得最佳准确度,请使用8。
因此,我们有:
A = [false false false false false false false false false false
false false true true true true true true false false
false true true true true true true true true false
false true true true true true true true true false
false true true true true true true true true false
false true true true true true true true true false
false true true true true true true true true false
false true true true true true true true true false
false false true true true true true true false false
false false false false false false false false false false];
out = bwperim(A,8);
它看起来像:
out =
0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 1 0 0
0 1 1 0 0 0 0 1 1 0
0 1 0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0 1 0
0 1 1 0 0 0 0 1 1 0
0 0 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0
MATLAB输出1表示真,0表示假。
作为奖励,这就是形状并排的样子:
根据您的评论,您希望找到构成周边的点集。因此,您只需使用find
命令为您执行此操作。
[X,Y] = find(out == 1);
coords = [X Y];
find
命令的作用是搜索数组并在数组中查找与find
参数中给出的布尔表达式匹配的位置。在这种情况下,我们希望找到所有坐标,其out
中的像素等于1,而out
是我们的周边图像。因此,这有效地查找了周边像素的所有像素。
我们得到:
coords =
3 2
4 2
5 2
6 2
7 2
8 2
2 3
3 3
8 3
9 3
2 4
9 4
2 5
9 5
2 6
9 6
2 7
9 7
2 8
3 8
8 8
9 8
3 9
4 9
5 9
6 9
7 9
8 9
X
是行坐标,而Y
是列坐标。我已将X
和Y
放入单个2D数组中以便更好地呈现,但您可以自行采用X
和Y
个变量进行进一步处理。< / p>
希望这有帮助!
答案 1 :(得分:2)
答案 2 :(得分:2)
图像处理工具箱的另一个选项:
B = A - imerode(A,SE);
其中SE
是其中一个内核:
0 1 0 1 1 1
1 1 1 1 1 1
0 1 0 1 1 1
取决于您要使用的连接:第一个用于8连接,第二个用于4连接。对于两者之间的差异,请记住8连接允许对角线邻居。
使用图像B,您可以在另一个答案中显示相同技术的周边的所有点:
[Xp,Yp] = find(B);