opencv库(6)

图像的分割之基于聚类的分割

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


Guess you like

Origin blog.csdn.net/weixin_49346755/article/details/121167184