我有一组 5x5 boolean 矩阵,例如下面的一个:
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 和 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 的新手,正在尝试自学,因此我认为我可以想到很多可行的方法,但我想不出如何实现它们。我尝试了多种方法,但我不太清楚如何正确实现它们。
感谢您的帮助。
最佳答案
使用 bwconncomp()
识别4-connected 组件 及其特征,然后调用 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
是非标量结构,将包含每个组件的边界框 参数,即 [左上角 x,左上角 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]}
关于matlab - 在 MatLab 中查找通过 boolean 矩阵的路径长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18368386/