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 相关文章推荐
简单介绍利用TK在Python下进行GUI编程的教程
Apr 13 Python
Python修改MP3文件的方法
Jun 15 Python
Python之ReportLab绘制条形码和二维码的实例
Jan 15 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
Mar 13 Python
python梯度下降法的简单示例
Aug 31 Python
Python函数any()和all()的用法及区别介绍
Sep 14 Python
详解pandas删除缺失数据(pd.dropna()方法)
Jun 25 Python
在Pycharm中调试Django项目程序的操作方法
Jul 17 Python
Django+python服务器部署与环境部署教程详解
Mar 30 Python
利用Python如何实时检测自身内存占用
May 09 Python
基于python实现判断字符串是否数字算法
Jul 10 Python
BeautifulSoup中find和find_all的使用详解
Dec 07 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 Class 文章
2007/04/04 PHP
php引用返回与取消引用的详解
2013/06/08 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
2018/08/04 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
2019/03/01 PHP
PHP析构函数destruct与垃圾回收机制的讲解
2019/03/22 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
2020/03/16 PHP
Aster vs KG BO3 第三场2.18
2021/03/10 DOTA
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
JavaScript中Object.prototype.toString方法的原理
2016/02/24 Javascript
jQuery事件与动画基础详解
2017/02/23 Javascript
Node.js开发第三方微信公众平台
2017/06/05 Javascript
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
还不懂递归?读完这篇文章保证你会懂
2018/07/29 Javascript
对VUE中的对象添加属性
2018/09/18 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
JavaScript创建、读取和删除cookie
2019/09/03 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
Json实现传值到后台代码实例
2020/06/30 Javascript
Python装饰器入门学习教程(九步学习)
2016/01/28 Python
Python 将RGB图像转换为Pytho灰度图像的实例
2017/11/14 Python
Python 通过打码平台实现验证码的实现
2019/05/13 Python
python面试题Python2.x和Python3.x的区别
2019/05/28 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
Python中如何将一个类方法变为多个方法
2019/12/30 Python
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
饲料采购员岗位职责
2013/12/19 职场文书
青春演讲稿范文
2014/05/08 职场文书
面试自我评价范文
2014/09/17 职场文书
四风问题对照检查材料思想汇报
2014/10/07 职场文书
党的群众路线教育实践活动个人对照检查材料(四风)
2014/11/05 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android
Appium中scroll和drag_and_drop根据元素位置滑动
2022/02/15 Python