2016-08-09 9 views
5

thisの逆を実行しようとしています:(連続的な)強度の2D画像が与えられた場合、不規則に間隔を置いた蓄積ポイントのセット、 (が重複していないが!)の領域で互いにより近くに位置する。不規則に間隔を置いた積算ポイントを計算する方法

私の最初の試みは、「重み付けされた」k平均でした。私が重み付けされたk-meansの実用的な実装を見出さなかったので、私が重みを導入する方法は、高い強度の点を繰り返すことからなる。ここに私のコードです:

import numpy as np 
from sklearn.cluster import KMeans 

def accumulation_points_finder(x, y, data, n_points, method, cut_value): 
    #computing the rms 
    rms = estimate_rms(data) 
    #structuring the data 
    X,Y = np.meshgrid(x, y, sparse=False) 
    if cut_value > 0.: 
     mask = data > cut_value 
     #applying the mask 
     X = X[mask]; Y = Y[mask]; data = data[mask] 
     _data = np.array([X, Y, data]) 
    else: 
     X = X.ravel(); Y = Y.ravel(); data = data.ravel() 
     _data = np.array([X, Y, data]) 

    if method=='weighted_kmeans': 
     res = [] 
     for i in range(len(data)): 
      w = int(ceil(data[i]/rms)) 
      res.extend([[X[i],Y[i]]]*w) 
     res = np.asarray(res) 
     #kmeans object instantiation 
     kmeans = KMeans(init='k-means++', n_clusters=n_points, n_init=25, n_jobs=2) 
     #performing kmeans clustering 
     kmeans.fit(res) 
     #returning just (x,y) positions 
     return kmeans.cluster_centers_ 

ここでは、1)すべてのデータピクセルを利用しています。 2)ある閾値(RMS)以上のピクセルのみを利用する。

With threshold

あなたがポイントを見ることができるように

Without threshold

は、高強度の領域に集中してより多くの規則的に離間しているようです。

だから私の質問は、そのような蓄積点を計算するために(可能であれば、決定論的な)より良い方法が存在するかどうかです。

答えて

1

四分木(https://en.wikipedia.org/wiki/Quadtree)を使用して等分散の単位にデータを分割します(または濃度値?を使用することもできます)。定義されたしきい値を使用して、ユニットあたり1ポイント(重心)を維持します。急激に値が変化する領域には細分化され、背景領域では細分化されます。

+0

ありがとう、これは素晴らしいアイデアです!私はこの方法を研究し、それを私の要求に適応しようとします。 – mavillan

関連する問題