python基于K-means聚类算法的图像分割


Posted in Python onOctober 30, 2019

1 K-means算法

实际上,无论是从算法思想,还是具体实现上,K-means算法是一种很简单的算法。它属于无监督分类,通过按照一定的方式度量样本之间的相似度,通过迭代更新聚类中心,当聚类中心不再移动或移动差值小于阈值时,则就样本分为不同的类别。

1.1 算法思路

  1. 随机选取聚类中心
  2. 根据当前聚类中心,利用选定的度量方式,分类所有样本点
  3. 计算当前每一类的样本点的均值,作为下一次迭代的聚类中心
  4. 计算下一次迭代的聚类中心与当前聚类中心的差距
  5. 如4中的差距小于给定迭代阈值时,迭代结束。反之,至2继续下一次迭代

1.2 度量方式

根据聚类中心,将所有样本点分为最相似的类别。这需要一个有效的盘踞,平方差是最常用的度量方式,如下

python基于K-means聚类算法的图像分割

2 应用于图像分割

我们知道:无论是灰度图还是RGB彩色图,实际上都是存有灰度值的矩阵,所以,图像的数据格式决定了在图像分割方向上,使用K-means聚类算法是十分容易也十分具体的。

2.1 Code

导入必要的包

import numpy as np
import random

损失函数

def loss_function(present_center, pre_center):
  '''
  损失函数,计算上一次与当前聚类中的差异(像素差的平方和)
  :param present_center: 当前聚类中心
  :param pre_center: 上一次聚类中心
  :return: 损失值
  '''
  present_center = np.array(present_center)
  pre_center = np.array(pre_center)
  return np.sum((present_center - pre_center)**2)

分类器

def classifer(intput_signal, center):
  '''
  分类器(通过当前的聚类中心,给输入图像分类)
  :param intput_signal: 输入图像
  :param center: 聚类中心
  :return: 标签矩阵
  '''
  input_row, input_col= intput_signal.shape # 输入图像的尺寸

  pixls_labels = np.zeros((input_row, input_col)) # 储存所有像素标签

  pixl_distance_t = [] # 单个元素与所有聚类中心的距离,临时用

  for i in range(input_row):
    for j in range(input_col):
      # 计算每个像素与所有聚类中心的差平方
      for k in range(len(center)):
        distance_t = np.sum(abs((intput_signal[i, j]).astype(int) - center[k].astype(int))**2)
        pixl_distance_t.append(distance_t)
      # 差异最小则为该类
      pixls_labels[i, j] = int(pixl_distance_t.index(min(pixl_distance_t)))
      # 清空该list,为下一个像素点做准备
      pixl_distance_t = []
  return pixls_labels

基于k-means算法的图像分割

def k_means(input_signal, center_num, threshold):
  '''
  基于k-means算法的图像分割(适用于灰度图)
  :param input_signal: 输入图像
  :param center_num: 聚类中心数目
  :param threshold: 迭代阈值
  :return:
  '''
  input_signal_cp = np.copy(input_signal) # 输入信号的副本
  input_row, input_col = input_signal_cp.shape # 输入图像的尺寸
  pixls_labels = np.zeros((input_row, input_col)) # 储存所有像素标签

  # 随机初始聚类中心行标与列标
  initial_center_row_num = [i for i in range(input_row)]
  random.shuffle(initial_center_row_num)
  initial_center_row_num = initial_center_row_num[:center_num]

  initial_center_col_num = [i for i in range(input_col)]
  random.shuffle(initial_center_col_num)
  initial_center_col_num = initial_center_col_num[:center_num]

  # 当前的聚类中心
  present_center = []
  for i in range(center_num):
    present_center.append(input_signal_cp[initial_center_row_num[i], initial_center_row_num[i]])
  pixls_labels = classifer(input_signal_cp, present_center)

  num = 0 # 用于记录迭代次数
  while True:
    pre_centet = present_center.copy() # 储存前一次的聚类中心
    # 计算当前聚类中心
    for n in range(center_num):
      temp = np.where(pixls_labels == n)
      present_center[n] = sum(input_signal_cp[temp].astype(int)) / len(input_signal_cp[temp])
    # 根据当前聚类中心分类
    pixls_labels = classifer(input_signal_cp, present_center)
    # 计算上一次聚类中心与当前聚类中心的差异
    loss = loss_function(present_center, pre_centet)
    num = num + 1
    print("Step:"+ str(num) + "  Loss:" + str(loss))
    # 当损失小于迭代阈值时,结束迭代
    if loss <= threshold:
      break
  return pixls_labels

3 分类效果

python基于K-means聚类算法的图像分割

聚类中心个数=3,迭代阈值为=1

python基于K-means聚类算法的图像分割

聚类中心个数=3,迭代阈值为=1

4 GitHub

click me

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
低版本中Python除法运算小技巧
Apr 05 Python
python获取一组数据里最大值max函数用法实例
May 26 Python
python自动截取需要区域,进行图像识别的方法
May 17 Python
Python unittest单元测试框架总结
Sep 08 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
Dec 14 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
使用APScheduler3.0.1 实现定时任务的方法
Jul 22 Python
python使用writerows写csv文件产生多余空行的处理方法
Aug 01 Python
Python Django Cookie 简单用法解析
Aug 13 Python
python 遍历pd.Series的index和value
Nov 26 Python
python实现读取类别频数数据画水平条形图案例
Apr 24 Python
python datetime时间格式的相互转换问题
Jun 11 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
Oct 30 #Python
Python文件路径名的操作方法
Oct 30 #Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
Oct 30 #Python
解决python 上传图片限制格式问题
Oct 30 #Python
Python字典的概念及常见应用实例详解
Oct 30 #Python
Python集合基本概念与相关操作实例分析
Oct 30 #Python
python opencv将表格图片按照表格框线分割和识别
Oct 30 #Python
You might like
php缓冲输出实例分析
2015/01/05 PHP
php解决DOM乱码的方法示例代码
2016/11/20 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
JS构建页面的DOM节点结构的实现代码
2011/12/09 Javascript
jQuery原型属性和原型方法详解
2015/07/07 Javascript
Web前端框架bootstrap实战【第一次接触使用】
2016/12/28 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
2017/08/29 Javascript
vue实现多级菜单效果
2019/10/19 Javascript
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
使用Python发送各种形式的邮件的方法汇总
2015/11/09 Python
python中判断文件编码的chardet(实例讲解)
2017/12/21 Python
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
python程序变成软件的实操方法
2019/06/24 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
基于python代码批量处理图片resize
2020/06/04 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
python爬虫爬取图片的简单代码
2021/01/18 Python
python 制作磁力搜索工具
2021/03/04 Python
解决Firefox下不支持outerHTML问题代码分享
2014/06/04 HTML / CSS
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
豆腐の盛田屋官网:日本自然派的豆乳面膜、肥皂、化妆水、乳液等
2016/10/08 全球购物
北京SQL新华信咨询
2016/09/30 面试题
县优秀教师事迹材料
2014/01/31 职场文书
商务专员岗位职责范本
2014/06/29 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
IT工程师岗位职责
2014/07/04 职场文书
现实表现证明材料
2015/06/19 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
人力资源部工作计划
2019/05/14 职场文书
python中mongodb包操作数据库
2022/04/19 Python