图像的分割之基于聚类的分割
c-均值聚类(HCM)
import numpy as np
import random
# 返回随机的聚类中心
def rand_center(img, c):
centers = []
for i in range(c):
rand_x = random.randint(0, img.shape[0])
rand_y = random.randint(0, img.shape[1])
centers.append(img[rand_x, rand_y])
return centers
# 对图像中的每一个点进行分类
def classifier(img, centers, c):
m, n = img.shape
# 存储图像的像素标签
labels = np.zeros((m, n))
# 存储单个元素与所有聚类中心的距离
dists = []
for i in range(m):
for j in range(n):
for k in range(c):
dist = abs((img[i, j].astype(int) - centers[k].astype(int)) ** 2)
dists.append(dist)
# 将距离最小的元素对应的聚类存储到标签数组中
labels[i, j] = dists.index(min(dists))
dists = []
return labels
# C均值聚类
def c_means(img, c):
# 初始化聚类中心
centers = rand_center(img, c)
# 对每个元素进行分类
labels = classifier(img, centers, c)
while True:
labels_tmp = labels
for i in range(c):
positions = np.where(labels == i)
# 对每个聚类取均值作为新的聚类中心
centers[i] = np.sum(img[positions].astype(int)) / len(img[positions].astype(int))
# 对新的聚类中心重新进行分类
labels = classifier(img, centers, c)
# 如果两个标签数组相同,说明已经分类完毕,结束循环
if (labels == labels_tmp).all():
break
return labels