MATLAB - 查找二进制位图的轮廓?

时间:2014-06-06 03:04:26

标签: matlab image-processing matrix

我有一个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块始终是凸的。

3 个答案:

答案 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表示假。

作为奖励,这就是形状并排的样子:

enter image description here

从评论中编辑

根据您的评论,您希望找到构成周边的点集。因此,您只需使用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是列坐标。我已将XY放入单个2D数组中以便更好地呈现,但您可以自行采用XY个变量进行进一步处理。< / p>

希望这有帮助!

答案 1 :(得分:2)

这是另一种选择:

B = bwboundaries(A)

这将获得任何边界的x-y坐标。查看更多信息here ...

答案 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);