给出了两个马赛克图像(mosaicA.bmp 和 mosaicB.bmp),利用kmeans和em图像分割方法进行分割,还提供了地图(mapA.bmp 和 mapB.bmp)用于数值比较。这涉及的特征可以是 Gabor 提取的多维特征向量过滤器组。您可以微调方向数(例如,8)和刻度(例如,5)得到最佳分割性能(最高分类精度)。
图为:mosaic A.bmp
图为:mapA.bmp
from sklearn.cluster import KMeans
from sklearn.mixture import GaussianMixture
centers = kmeans.cluster_centers_
means_init = centers
# 构建GMM模型
gmm = GaussianMixture(n_components=4, means_init=means_init)
# 训练模型
gmm.fit(data)
em.png:
def gaborcls(filename):
img = cv2.imread(filename) # 读图像
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转灰度
frequency = 0.6
# gabor变换
real, imag = filters.gabor(img_gray, frequency=0.6, theta=60, n_stds=5)
# 取模
img_mod = np.sqrt(real.astype(float) ** 2 + imag.astype(float) ** 2)
# 图像缩放(下采样)
newimg = cv2.resize(img_mod, (0, 0), fx=1 / 4, fy=1 / 4, interpolation=cv2.INTER_AREA)
tempfea = newimg.flatten() # 矩阵展平
tmean = np.mean(tempfea) # 求均值
tstd = np.std(tempfea) # 求方差
newfea = (tempfea - tmean) / tstd # 数值归一化
return newfea
这段代码会得到一列特征量,我们对前后特征量进行余弦操作cosine
//对组合分割效果进行分析
filename = 'em.png'
newfea = gaborcls(filename)
tmp=cosine(newfea,fea)
print(newfea)
print(tmp)
//对kmeans单独分割效果进行分析
filename = 'kmean.png'
newfea = gaborcls(filename)
print(newfea.shape)
tmp=cosine(newfea,fea)
print(newfea)
print(tmp)
通过计算余弦相似度比较和mapA.bmp效应的差异,通过比较,一般来说,结合kmean和em算法确实有更好的效果,得到的结果明显优于单独的kmean算法。



