Python中的偏心率估计
我有一个二进制的numpy数组,并且用scipy.ndimage给连接的区域打了标签。请问有没有什么方法可以用来估算每个标记区域的偏心率?
补充说明:
我想制定一些标准,来找出并丢掉那些长度远大于宽度的标记区域。在下面这个数组中,我可能想保留7,而丢掉3。
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
2 个回答
1
假设你每个标签只用一次:一个有奇怪形状的块的矩阵,会有比空列更多的空行,或者反过来。
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)
这样可以去掉非常长的(竖着的)块,把行和列调换过来,以去掉横着拉长的块。
2
我想你首先需要一点数学知识。我们先考虑你只有一个标记为1的“blob”(可以理解为一团东西)。你的矩阵标签将是一个标量场。
首先,你需要计算它的平均值:
这里的 是你的标签(它没有索引,因为它是一个标量)。接下来计算:
一个好的离心率定义是这个矩阵的无迹部分的两个最大特征值的比率(在二维情况下,你只会有两个特征值)。你也可以对它进行归一化,使其值在0到1之间。我对scipy不够熟悉,无法写出高效的代码来实现这个。