我想提取图像蒙版的两个区域的索引/位置,我使用python,opencv2,numpy和scipy的组合。获取python,opencv2,numpy中图像蒙版上的特征位置索引
我有一个二进制mask
与图像大小相同。 与
label_im, nb_labels = ndimage.label(mask)
sizes = ndimage.sum(mask, label_im, range(nb_labels + 1))
生成标签和它的尺寸有了这些信息之后,我能提取最大的领域。
比方说,我们有一个10×10矩阵:
1 1 1 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0
1 1 1 0 0 0 0 2 2 0
0 0 0 0 0 0 0 2 2 0
0 3 3 3 3 0 0 2 2 0
0 3 3 3 3 0 0 2 2 0
0 3 3 3 3 0 0 2 2 0
0 3 3 3 3 0 0 2 2 0
0 3 3 3 3 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
我有3个不同的区域(1,2,3),我已经知道了,我需要进一步分析区域2和3(因为这些都是两个最大)。
现在我想找到它们中的像素的索引
- 最上面的区域的最左 - 以下标记为(n)的
- 最下面的区域的最右侧的 - 与[N] 以下标
同上矩阵:
1 1 1 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0
1 1 1 0 0 0 0 (2) 2 0
0 0 0 0 0 0 0 2 2 0
0 (3) 3 3 3 0 0 2 2 0
0 3 3 3 3 0 0 2 2 0
0 3 3 3 3 0 0 2 2 0
0 3 3 3 3 0 0 2 [2] 0
0 3 3 3 [3] 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
如何做T的最快方法帽子?
问题1: 我努力与这些矩阵条件的语法。 例如,我尝试:
mask2 = mask[label_im == 2]
应当再次获得二进制掩码,但只有集合中的小区在其原有的面膜具有2 我不完全相信上述的结果产生。我因此无法进一步处理它。
问题2: 之后,我会做这样的事情找出其中最上边最左边的像素设置的行/列的索引。 与最低点相同。
例如,对于区域2,结果应该是:(像上面的矩阵)
point1-X = 7
point1-Y = 2
point2-X = 8
point2-Y = 7
其中X代表列,和Y为行
或者是(在索引0处开始)有更好的方法来解决像python/opencv2/numpy/scipy的组合这样的问题吗?
哇!非常感谢你的帮助!它工作完美! –
我第一次尝试你的基于numpy的解决方案,然后用示例图像1920x1080的opencv解决方案。 S1的时间为:0.0529999732971s,S2的时间为:0.0599999427795s,所以这些实现之间的差异并不真正明显。无论如何,谢谢基于opencv的解决方案! –