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 cx_freeze打包工具处理问题思路及解决办法
Feb 13 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
Jan 11 Python
python生成tensorflow输入输出的图像格式的方法
Feb 12 Python
flask框架视图函数用法示例
Jul 19 Python
Python SMTP发送邮件遇到的一些问题及解决办法
Oct 24 Python
Python设计模式之原型模式实例详解
Jan 18 Python
python开发之anaconda以及win7下安装gensim的方法
Jul 05 Python
django框架基于queryset和双下划线的跨表查询操作详解
Dec 11 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
Python搭建Keras CNN模型破解网站验证码的实现
Apr 07 Python
Python中有几个关键字
Jun 04 Python
python基础之//、/与%的区别详解
Jun 10 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设计模式中工厂模式详细介绍
2013/05/15 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
php+mysql实现用户注册登陆的方法
2015/01/03 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
jQuery 性能优化手册 推荐
2010/02/23 Javascript
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
javascript html5轻松实现拖动功能
2017/03/01 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
2017/05/07 Javascript
提高Node.js性能的应用技巧分享
2017/08/10 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
python3写爬取B站视频弹幕功能
2017/12/22 Python
基于python内置函数与匿名函数详解
2018/01/09 Python
基于Django与ajax之间的json传输方法
2018/05/29 Python
python的依赖管理的实现
2019/05/14 Python
pandas-resample按时间聚合实例
2019/12/27 Python
python实现与redis交互操作详解
2020/04/21 Python
英国顶级家庭折扣店:The Works
2017/09/06 全球购物
毕业生个人求职的自我评价
2013/10/28 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
灵山大佛导游词
2015/02/04 职场文书
2019预备党员转正申请书模板2篇!
2019/08/07 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python
浅谈JavaScript作用域
2021/12/06 Javascript