我试图与this相反:给定(连续)强度的2D图像,生成一组不规则间隔的累积点,即不规则地覆盖2D地图的点,更接近每个其他在高强度区域(但没有重叠!)。
我的第一次尝试是"加权" K均值。由于我没有找到加权k均值的工作实现,我引入权重的方式包括重复高强度的点。这是我的代码:
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)的像素。
正如您所看到的那样,点的间距似乎比高强度区域更集中。
所以我的问题是否存在(确定性的,如果可能的话)更好的方法来计算这样的积累点。
答案 0 :(得分:1)
使用四叉树(https://en.wikipedia.org/wiki/Quadtree)将数据划分为相等方差单位(或者也可以使用浓度值?),使用定义的threhold,然后保持每单位一个点(质心) 。价值快速变化的区域将会有更多细分,背景区域将更少。