在MatLab中通过布尔矩阵查找路径长度

时间:2013-08-21 21:56:33

标签: matlab matrix path boolean

我有一组 5x5 布尔矩阵,例如下面的一个:

0 1 0 1 1
1 1 1 0 0
1 0 0 1 1
1 1 1 1 0
0 0 0 0 1

我想要一种输出方式,对于每个连接的1系列(连接意味着1是左边,右边,上面或下面的另一个1,对角线不计算)它在x轴上占用的长度以及它在y轴上占用的长度。例如。对于这个矩阵有一个从左到右一路,所以x中有5个单位,y中有4个单位:

  1
1 1 1
1     1 1
1 1 1 1

右上角还有一个集合,x中有2个单位,y中只有1个单位:

      1 1

并且右下角会有一个在x中占1,在y中占1。

我想在xmax1 = 5 ymax1 = 4的行中输出这个矩阵, xmax2 = 2 ymax2 = 1,xmax3 = 1 ymax3 = 1。我已经设法制作了一些正确的代码,但只适用于简单的矩阵。例如。一个只有一个连接的1组,其中xmax和ymax只是简单的直线,例如我可以这样做:

1 1 1 1 0
0 1 0 0 0
1 1 0 0 0
1 1 0 0 0
0 1 0 0 0

由于最长的x路径是顶部的直线,最长的y max是向下的直线。但是,如果它开始“蛇”,例如:

0 0 1 0 0
0 1 1 0 0
0 1 0 0 0
0 1 1 0 0
0 0 1 1 1

我会得到ymax = 3和xmax = 3的结果,因为它们是最长的直线,而不是它实际上应该是距离最远的直线的长度,所以在这种情况下应该是ymax = 5和xmax = 4

我是MatLab的新手并试图自学,因此我认为我可以想到许多可行的方法,但是我想不出如何实现它们。我尝试了多种方法,但我不太清楚如何正确实现它们。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

使用bwconncomp()识别 4个连接的组件及其功能,然后调用regionprops()以简化这些组件的某些属性的计算:

A = [0 1 0 1 1
     1 1 1 0 0
     1 0 0 1 1
     1 1 1 1 0
     0 0 0 0 1]

s = regionprops(bwconncomp(A,4),'BoundingBox');

s是非标量结构,将包含每个组件的边界框参数,即[upper-left corner x, upper-left corner y, xwidth, ywidth]

例如:

s(1)
ans = 
    BoundingBox: [0.5 0.5 5 4]

请注意,有3个连接的组件(单个元素也计算在内):

bwconncomp(A,4)
ans = 
    Connectivity: 4
       ImageSize: [5 5]
      NumObjects: 3
    PixelIdxList: {[11x1 double]  [2x1 double]  [25]}

答案 1 :(得分:0)

如果您有图像处理工具箱,则 regionprops 功能可能会有所帮助。它返回有关连接组件(相邻1的区域)的各种信息。

它可以返回的一个功能标识连接组件中每个元素的索引 - 您可以使用ind2sub将这些索引转换为下标,然后查看索引的最大值和最小值。

foo = rand(5,5) < 0.5;
stats = regionprops(foo, 'PixelIdxList');
[y,x] = ind2sub(stats(1).PixelIdxList) % index list for first region
max(y) - min(y) % length in y
max(x) - min(x) % length in x

您可能会发现regionprops返回的某些其他功能对您正在执行的任何操作都有帮助。看一看。 :)