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

时间:2017-06-01 19:11:34

标签: python image-processing machine-learning scikit-learn cluster-analysis

我有一个池塘的图像(草,边缘的岩石,水)。我想使用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.

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

1 个答案:

答案 0 :(得分:2)

所以我需要做的就是在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种不同类型的材料(岩石,草,水)。