首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sklearn GaussianMixture on Images

sklearn GaussianMixture on Images
EN

Stack Overflow用户
提问于 2021-03-26 14:57:39
回答 1查看 62关注 0票数 0

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

为此,我想使用sklearn.mixture.GaussianMixture。此代码将高斯分布的混合回归到数据。这通常是像this一样完成的

代码语言:javascript
复制
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点。根据我的形象,我可以这样做:

代码语言:javascript
复制
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函数。有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2021-03-26 15:08:00

我找到了一种“作弊”的方式:

代码语言:javascript
复制
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]]添加到要处理的点列表中。这提供了:

然而,这个解决方案太难看了。所以我很想看看有没有更好的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66812293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档