机器学习十大经典算法之K-means (图像分割,python)

十大经典算法分别为:

  1. K-means K均值(无监督算法,聚类算法,随机算法) 
  2. KNN(K Nearest Neighbor) K近邻(有监督算法,分类算法) 
  3. 逻辑回归(分类算法) 
  4. 决策树(有监督算法,概率算法) 
  5. 随机森林(集成算法中最简单的,模型融合算法) 
  6. 朴素贝叶斯 
  7. EM算法 
  8. Adaboost(集成算法之一)
  9. SVM
  10. 马尔可夫 

一、算法过程

(1)随机选择k个初始聚类中心;

(2)计算其他样本点与聚类中心的距离;

(3)将最小距离的标签赋给当前样本;

(4)更新聚类中心。

二、基于K-means的图像分割

基于边用边学的思想,这里做了一个图像分割项目。

(1)距离公式:

D(I_i, I_c) = \sqrt{ \sum_{j=1}^3 {(I_{ij} - I_{cj})^2} }

其中i表示第i个样本,c表示第c个聚类中心;j表示rgb的第j个通道值。

(2)终止条件是达到迭代次数。

(3)跌倒100次后效果图:

三、Python实现

import numpy as np
import matplotlib.pyplot as plt

img = plt.imread('G:/Experiment/Machine Learning/boat.jpg')
img_row = img.shape[0]
img_col = img.shape[1]

def knn(img, iter, k):
    img = img.reshape(-1,3) # 使二维空间,变成一维空间,避免后面计算距离时使用双层循环, 这样每一行代表不同空间的像素
    img_new = np.column_stack((img, np.ones(img_row*img_col))) # 加一列

    # (1) 随机选择k个像素作为初始聚类中心
    cluster_orientation = np.random.choice(img_row*img_col, k, replace=False) # 产生k索引坐标,即k个中心的位置
    cluster_center = img_new[cluster_orientation, :] # shape =(5,4)根据索引坐标,找到对应的聚类中心的rgb像素值

    # 迭代
    distance = [ [] for i in range(k)] # [ [], [], [], [], []]生成list,每个元素是一个列向量,该列向量保存的是所有像素距离中心j的距离
    for i in range(iter):
        # (2) 计算所有像素与聚类中心j的颜色距离
        print("迭代次数:%d" % i)
        for j in range(k):
            distance[j] = np.sqrt(np.sum(np.square(img_new - cluster_center[j]), axis=1)) # data_new.shape = (269180,4),一行的和

        # (3) 在当前像素与k个中心的颜色距离中,找到最小那个中心,更新图像所有像素label
        # np.array(distance).shape = (5, 269180) ,返回一列中最小值对应的索引,范围是 [0, 4], 代表不同的label
        orientation_min_dist = np.argmin(np.array(distance), axis=0)   # np.array(distance).shape = (5, 269180) 一列中最小值
        img_new[:, 3] = orientation_min_dist # shape = (269180, ), 将返回的索引列向量赋值给第4维,即保存label的第3列
        # (4) 更新第j个聚类中心
        for j in range(k):
            # np.mean(r,g,b,label),属性和label都求个平均值
            one_cluster = img_new[img_new[:, 3] == j] # 找到所有label为j的像素,其中img_new.shape = (269180,4)
            cluster_center[j] = np.mean(one_cluster, axis=0) # 通过img_new[:, 3] == j找到所有label为j的行索引(?, 4),
            # 求一列均值,这样mean_r ,mean_g_, mean_b, mean_label,一次循环得到(1,4)

    return img_new

if __name__ == '__main__':
    labels_vector = knn(img, 100, 5)
    labels_img = labels_vector[:,3].reshape(img_row, img_col)
    plt.imshow(labels_img)
    plt.show()


 

  • 15
    点赞
  • 141
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
课程设计题目:基于K-Means算法图像分割实现 一、课程设计背景 图像分割是计算机视觉领域的一个重要研究方向,其主要目的是将一幅图像分成若干个不同的部分,每一部分都具有一定的语义意义。其中K-Means算法是一种常用的图像分割算法,它通过对图像像素点聚类,实现对图像的分割。 二、课程设计目标 本课程设计旨在帮助学生深入理解K-Means算法的原理和应用,并通过实践掌握如何基于K-Means算法实现图像分割。 三、课程设计内容 1. K-Means算法原理介绍 - K-Means算法基本原理 - K-Means算法流程图 - K-Means算法优缺点分析 2. 图像分割基础知识 - 图像分割概念解析 - 基于阈值的图像分割方法 3. 基于K-Means算法图像分割实现 - 图像数据读取 - K-Means算法实现 - 图像分割结果展示 4. 实验设计与实验结果分析 - 实验设计与实现 - 实验结果分析与总结 四、课程设计要求 1. 学生应具备一定的Python编程基础; 2. 学生需要自备一台电脑,并安装好Python环境; 3. 学生需要自行查找相关文献和资料,进行学习和实践; 4. 学生需要按时提交课程设计报告和程序代码。 五、参考文献 1. 周志华. 机器学习[M]. 清华大学出版社, 2016. 2. 李航. 统计学习方法[M]. 清华大学出版社, 2012. 3. 董辉, 李旭峰. 基于K-Means算法图像分割[J]. 计算机工程与应用, 2017, 53(14): 138-143. 4. 郭大为, 董昆. 基于K-Means算法图像分割研究[J]. 北京信息科技大学学报, 2017, 32(5): 1-5.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值