我想使用高斯混合模型来找到多峰分布的中心,如下所示:

为此,我想使用sklearn.mixture.GaussianMixture。此代码将高斯分布的混合回归到数据。这通常是像this一样完成的
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
from sklearn import mixture
n_samples = 300
# generate random sample, two components
np.random.seed(0)
# generate spherical data centered on (20, 20)
shifted_gaussian = np.random.randn(n_samples, 2) + np.array([20, 20])
# generate zero centered stretched Gaussian data
C = np.array([[0., -0.7], [3.5, .7]])
stretched_gaussian = np.dot(np.random.randn(n_samples, 2), C)
# concatenate the two datasets into the final training set
X_train = np.vstack([shifted_gaussian, stretched_gaussian])
# fit a Gaussian Mixture Model with two components
clf = mixture.GaussianMixture(n_components=2, covariance_type='full')
clf.fit(X_train)重点是,数据是以形成高斯云的二维点列表的形式给出的。我的数据有点不同-更像是加权的x,y点。根据我的形象,我可以这样做:
import numpy, cv2
image = cv2.imread("double_blob.jpg")
xs, ys = np.meshgrid(list(range(image.shape[0])), list(range(image.shape[1])))
xs, ys = xs.flatten(), ys.flatten()
weights = image[xs, ys].flatten()以获取x,y图像坐标和权重的列表。但我不知道如何将其提供给GaussianMixture函数。有什么想法吗?
发布于 2021-03-26 15:08:00
我找到了一种“作弊”的方式:
from sklearn.mixture import GaussianMixture
data = cv.imread("dual_blob.jpg")
data = cv.normalize(data, None, 0, 255, cv.NORM_MINMAX)
gmm = GaussianMixture(n_components=2)
xs, ys = np.meshgrid(list(range(glint_size*2)), list(range(glint_size*2)))
xs, ys = xs.flatten(), ys.flatten()
gmm_data = [
np.array([[x, y]] * int(data[x, y])).transpose()
if int(data[x, y]) > 0
else -np.ones((2, 1))
for x, y in zip(xs, ys)
]
gmm_data = np.concatenate(gmm_data, axis=1)
gmm_data = gmm_data[gmm_data >= 0]
gmm_data = gmm_data.reshape(2, gmm_data.shape[0] // 2).transpose()
print(gmm_data)
gmm.fit(gmm_data)
centers = gmm.means_基本上,它所做的是将图像归一化到0到255之间。然后它遍历每个像素,并创建与该像素上的图像值一样多的坐标点。因此,如果[3, 7]处的像素的值为10,则会将[[3, 7], [3, 7],[3, 7],[3, 7],[3, 7],[3, 7],[3, 7],[3, 7],[3, 7],[3, 7]]添加到要处理的点列表中。这提供了:

然而,这个解决方案太难看了。所以我很想看看有没有更好的东西。
https://stackoverflow.com/questions/66812293
复制相似问题