我有一个二进制numpy数组,并用scipy.ndimage标记了连接区域。我是否可以通过电话来估算每个标记部分的偏心率?
编辑:
我正在尝试制定标准,以找到并抛弃比它们更宽的标记部分。在下面的数组中,我可能想保留7s并抛出3s。
3 3 0 0 0 0
3 3 0 7 7 7
3 3 0 7 7 7
3 3 0 7 0 7
3 3 0 0 0 0
答案 0 :(得分:2)
我猜你首先需要一点数学。首先考虑您只有一个标记为1的blob。您的矩阵标签将是标量字段。 你应该首先计算它的平均值:
其中是你的标签(它没有索引,因为它是标量)。 然后计算:
偏心率的一个很好的定义是该矩阵的无痕迹部分的两个最大特征值的比率(在2D中,您将只有2个特征值)。您还可以将其标准化以获得介于0和1之间的值。 我没有用scipy来编写一个有效的代码。
答案 1 :(得分:1)
假设您只为每个标签分配一次:带有偏心blob的矩阵将比空列具有更多的空行,反之亦然。
labels = [2,3,7] # or whatever you have
good_labels = []
for label in labels:
m = matrix == label
non_empty_columns = sum(sum(m)>0)
non_empty_rows = sum(sum(m.transpose())>0)
if 1.0 * non_empty_rows / (non_empty_columns+0.001) > threshold:
good_labels.append(label)
这将移除非常长(垂直)的斑点,转动行和列以移除水平拉伸的斑点。