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 13 Python
Python基于TCP实现会聊天的小机器人功能示例
Apr 09 Python
Python3.7实现中控考勤机自动连接
Aug 28 Python
Python 实现异步调用函数的示例讲解
Oct 14 Python
Python中的 enum 模块源码详析
Jan 09 Python
人工神经网络算法知识点总结
Jun 11 Python
如何用Python制作微信好友个性签名词云图
Jun 28 Python
python正则-re的用法详解
Jul 28 Python
简单分析python的类变量、实例变量
Aug 23 Python
python之yield和Generator深入解析
Sep 18 Python
Python 远程开关机的方法
Nov 18 Python
Python绘画好看的星空图
Mar 17 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
广播爱好者需要了解的天线知识
2021/03/01 无线电
JavaScript 空位补零实现代码
2010/02/26 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
JS onmousemove鼠标移动坐标接龙DIV效果实例
2013/12/16 Javascript
Javascript保存网页为图片借助于html2canvas库实现
2014/09/05 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
jQuery+slidereveal实现的面板滑动侧边展出效果
2015/03/14 Javascript
JavaScript代码性能优化总结篇
2016/05/15 Javascript
javascript事件模型介绍
2016/05/31 Javascript
利用Vue.js指令实现全选功能
2016/09/08 Javascript
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
微信小程序实现文字跑马灯效果
2020/05/26 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
2018/11/23 Javascript
微信小程序websocket聊天室的实现示例代码
2019/02/12 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
深入学习Python中的上下文管理器与else块
2017/08/27 Python
Python数据结构之图的应用示例
2018/05/11 Python
使用Python操作FTP实现上传和下载的方法
2019/04/01 Python
一篇文章了解Python中常见的序列化操作
2019/06/20 Python
python装饰器常见使用方法分析
2019/06/26 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
协议书格式
2014/04/23 职场文书
医学生求职自荐书
2014/06/12 职场文书
鼓舞士气的口号
2014/06/16 职场文书
成事在人观后感
2015/06/16 职场文书
鲁滨逊漂流记读书笔记
2015/06/26 职场文书
护士医德医风心得体会
2016/01/25 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL