如何使用高斯混合模型按波长分割图像?

Posted

技术标签:

【中文标题】如何使用高斯混合模型按波长分割图像?【英文标题】:How can I use a Gaussian Mixture Model to segment an image by wavelength? 【发布时间】:2017-11-03 01:31:43 【问题描述】:

我有一个池塘的图像(草、边缘的岩石、水)。我想使用 GMM 作为无监督分类器,将图像分割成草、岩石和水。

图像是形状为 (800, 800, 4) 的 numpy 数组形式,其中每个像素包含 4 个波长的强度数据。例如,像素 x=1 y=1 具有对应于波长 [450, 500, 600, 700] 的强度数据 [1000, 2000, 1500, 4000]。

我尝试使用 scikit-learn 拟合 GMM:

gmm=GaussianMixture(n_components=3, covariance_type="tied")
gmm=gmm.fit(data)

但是,我得到一个错误,说数据的预期维度应该小于或等于 2。

是否有任何可用的 Python 包或函数可以使 GMM 适应更高维数据?

【问题讨论】:

通过对 4 个值进行转换以减少它们会丢失多少信息 - 本质上是将其转换为灰度图像? 再次,您需要确定您认为的样本和功能。您可以将每个像素视为从 4 维波长分布中抽取的样本,然后将 GMM 拟合到该分布。在这种情况下,您需要做的就是将data 数组折叠到前两个维度上,使其形状为(640000, 4) 而不是(800, 800, 4)。这对你的情况有意义吗?从你的描述我看不出来。您想通过将 GMM 拟合到这些数据来回答什么问题?你能编辑你的问题来解释一下吗? 基本上我有一个池塘的图像(草、沿边缘的岩石、水),图像在 y 方向为 800 像素,在 x 方向为 800 像素,每个像素包含来自 4 个重要波长的数据,例如像素 x=1 y=1 具有对应于波长 [450,500,600,700] 的数据 [1000,2000, 1500,4000]。我希望使用 gmm 作为无人监督的分类器,将草从岩石和水中分割出来。我真的很感谢你在这方面的帮助。感谢您对我的耐心和对问题的坚持。 您介意编辑您的问题,使其包含实际的问题描述吗?这是必不可少的信息,所以不应该把它埋在 cmets 里。 请勿交叉发帖:datascience.stackexchange.com/q/19405/924 【参考方案1】:

所以我需要做的就是在 x,y 维度上折叠数组,GMM.fit 方法接受了我的数组输入。原始数据格式为 (800,800,4),我将其重新整形为 (800*800, 4) 数组。

GMM拟合和聚类的代码如下:

newdata = img_data.reshape(800*800, 4)
gmm = GaussianMixture(n_components=3, covariance_type="tied")
gmm = gmm.fit(newdata)

cluster = gmm.predict(newdata)
cluster = cluster.reshape(800, 800)
imshow(cluster)

我选择了n_components=3,因为我希望分割 3 种不同类型的材料(岩石、草、水)。

【讨论】:

如果您想查看聚类/分割图像的样子,请使用plt.imshow(gmm.means_[cluster]),这会将高斯的均值投影回图像像素,而不是聚类索引(这使得没有视觉感受)

以上是关于如何使用高斯混合模型按波长分割图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何简单易懂的解释高斯混合(GMM)模型?

使用高斯混合模型对图像进行聚类

高斯混合模型(GMM)

高斯混合模型图像聚类图像生成可视化分析实战

如何用高斯混合模型 GMM 做聚类

用于像素聚类的高斯混合模型