バイナリ 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
最初に少し数学が必要だと思います。最初に、1 とラベル付けされたブロブが 1 つだけあると考えてみましょう。行列ラベルはスカラー フィールドになります。最初にその平均を計算する必要があります。
ラベルはどこですか(スカラーであるため、インデックスはありません)。次に計算します。
離心率の適切な定義は、この行列のトレースのない部分の 2 つの最大の固有値の比率です (2D では、固有値は 2 つしかありません)。それを正規化して、0 から 1 の間の値を取得することもできます。私は scipy に十分に慣れていないため、効率的なコードを記述できません。
各ラベルを 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)
これにより、非常に長い (垂直方向の) ブロブが削除され、行と列が反転して水平方向に伸びたブロブが削除されます。