我有一组 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的新手并试图自学,因此我认为我可以想到许多可行的方法,但是我想不出如何实现它们。我尝试了多种方法,但我不太清楚如何正确实现它们。
感谢您的帮助。
答案 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返回的某些其他功能对您正在执行的任何操作都有帮助。看一看。 :)