0

我有一个池塘的图像(草,沿边缘的岩石,水)。我想用GMM作为无监督分类器将图像分割成草,岩石和水。如何使用高斯混合模型按波长分割图像?

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

我试着使用,以适应GMM scikit学习:

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

但是,我得到了一个错误,指出该数据的预期尺寸应小于或等于2

是有没有可用于GMM的更高维数据的Python包或函数?

+0

通过对4个值执行转换以减少它们,从而将其丢失了多少信息 - 从本质上将其转换为灰度图像? – chase

+0

使用PCA,此数据已从150个频段减少至4个频段。我在考虑自组织映射以及转换为二维数组,但我的顾问坚持在当前数组上使用GMM。 –

+0

目前还不清楚“数据”数组的维度对应于什么。 'GaussianMixture'的'.fit'方法(像scikit-learn中的每个其他估计器)都需要一个'(n_samples,n_features)'数组作为第一个参数。你的'(800,800,4)'数组中的每一行是否对应一个样本?或者'data'只是一张800x800x4的图片? –

回答

0

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