4

我有一组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 轴。这个矩阵的 EG 会有一个从左到右一直走,所以 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 的新手并试图自学,因此我想我可以想到很多可行的方法,但是我想不出如何实现它们。我尝试了多种方法,但我不太想如何正确实施它们。

感谢您的任何帮助。

4

2 回答 2

1

识别4 连接组件及其特征,bwconncomp()然后调用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]

Note that there 3 connected components (a single element counts as well):

bwconncomp(A,4)
ans = 
    Connectivity: 4
       ImageSize: [5 5]
      NumObjects: 3
    PixelIdxList: {[11x1 double]  [2x1 double]  [25]}
于 2013-08-21T22:54:41.023 回答
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 返回的其他一些功能对您正在做的任何事情都有帮助。看一看。:)

于 2013-08-21T22:54:13.983 回答