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中的元组与逻辑运算符
Oct 13 Python
python中defaultdict的用法详解
Jun 07 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
Jul 20 Python
python删除文本中行数标签的方法
May 31 Python
python实现pdf转换成word/txt纯文本文件
Jun 07 Python
TensorFlow MNIST手写数据集的实现方法
Feb 05 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
May 22 Python
详解Python直接赋值,深拷贝和浅拷贝
Jul 09 Python
基于Python pyecharts实现多种图例代码解析
Aug 10 Python
python tkinter实现连连看游戏
Nov 16 Python
python实现定时发送邮件
Dec 23 Python
OpenCV-Python实现人脸美白算法的实例
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
综合图片计数器
2006/10/09 PHP
mysql+php分页类(已测)
2008/03/31 PHP
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
php禁用cookie后session设置方法分析
2016/10/19 PHP
PHP与SQL语句常用大全
2016/12/10 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
ThinkPhP+Apache+PHPstorm整合框架流程图解
2020/11/23 PHP
js实现跨域的多种方法
2015/12/25 Javascript
图解prototype、proto和constructor的三角关系
2016/07/31 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
基于react框架使用的一些细节要点的思考
2017/05/31 Javascript
JS+HTML+CSS实现轮播效果
2017/11/28 Javascript
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
vue中eventbus被多次触发以及踩过的坑
2017/12/02 Javascript
浅谈vue项目优化之页面的按需加载(vue+webpack)
2017/12/11 Javascript
Vue-cropper 图片裁剪的基本原理及思路讲解
2018/04/17 Javascript
Jquery的autocomplete插件用法及参数讲解
2019/03/12 jQuery
微信小程序如何实现全局重新加载
2019/06/05 Javascript
js将URL网址转为16进制加密与解密函数
2020/03/04 Javascript
微信小程序之高德地图多点路线规划过程示例详解
2021/01/18 Javascript
Python简单实现子网掩码转换的方法
2016/04/13 Python
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
Python求出0~100以内的所有素数
2018/01/23 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
2020/05/29 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
英国DVD和蓝光碟片购买网站:Zoom.co.uk(电影和电视)
2019/09/23 全球购物
博柏利美国官方网站:Burberry美国
2020/11/19 全球购物
有模特经验的简历自我评价
2013/09/19 职场文书
校本教研工作方案
2014/01/14 职场文书
毕业生自荐书
2014/02/03 职场文书
群众路线四风对照检查材料
2014/11/04 职场文书
MybatisPlus EntityWrapper如何自定义SQL
2022/03/22 Java/Android