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

MATLAB-查找二进制位图的轮廓?,matlab,image-processing,matrix,Matlab,Image Processing,Matrix,我有一个10x10二进制位图,如下所示。我正在寻找一种在MATLAB中查找其轮廓的有效方法。(我曾尝试让每个值“环顾”其邻居的值并做出决定,但这太低效了。我希望算法能够扩大规模。) 让我们假设每个布尔值类似于一个正方形,左下角的值位于x:0-1;y:0-1。输出应该是形成边界的点。您可以假设内部的true块始终是凸的。这非常简单。使用MATLAB中的bwperim命令,假设您有图像处理工具箱 您可以这样调用函数: out = bwperim(A); %//or out = bwperim(A,

我有一个
10x10
二进制位图,如下所示。我正在寻找一种在MATLAB中查找其轮廓的有效方法。(我曾尝试让每个值“环顾”其邻居的值并做出决定,但这太低效了。我希望算法能够扩大规模。)


让我们假设每个布尔值类似于一个正方形,左下角的值位于
x:0-1;y:0-1
。输出应该是形成边界的点。您可以假设内部的
true
块始终是凸的。

这非常简单。使用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。。。但现在,我假设它只是二维的。为获得最佳精度,请使用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
变量进行进一步处理


希望这有帮助

这非常简单。使用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。。。但现在,我假设它只是二维的。为获得最佳精度,请使用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
变量进行进一步处理

希望这有帮助

还有一个选择:

B = bwboundaries(A)
这将获得任何边界的x-y坐标。查看更多信息…

这里有另一个选项:

B = bwboundaries(A)

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

图像处理工具箱的另一个选项:

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

图像处理工具箱的另一个选项:

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

谢谢你,伙计!我的最终目标实际上是得到一系列形成边界的点。从这里到那里似乎仍然有点棘手goal@FarticlePilter这也很容易。只需做
[X,Y]=find(out==1)我还编辑了我的帖子以反映您的评论。非常感谢!差不多完成了。现在的问题是我需要得到直线边界,而不是正方形边界。直接从
[X,Y]=find(out==1)
获取这样一个“更小”的边界,但我需要边界线