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 07 Python
python3实现字符串操作的实例代码
Apr 16 Python
使用python进行波形及频谱绘制的方法
Jun 17 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
Jul 15 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
Jul 17 Python
python argparser的具体使用
Nov 10 Python
Pytorch在NLP中的简单应用详解
Jan 08 Python
python读取yaml文件后修改写入本地实例
Apr 27 Python
Python实现一个简单的毕业生信息管理系统的示例代码
Jun 08 Python
查看keras的默认backend实现方式
Jun 19 Python
Python实现手绘图效果实例分享
Jul 22 Python
Python‘==‘ 及 ‘is‘相关原理解析
Sep 05 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
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
php导入csv文件碰到乱码问题的解决方法
2014/02/10 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
dojo 之基础篇(三)之向服务器发送数据
2007/03/24 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
基于jquery实现复选框全选,反选,全不选等功能
2015/10/16 Javascript
原生JS和jQuery操作DOM对比总结
2017/01/19 Javascript
Javascript中字符串和数字的操作方法整理
2017/01/22 Javascript
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
pandas object格式转float64格式的方法
2018/04/10 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
Django xadmin安装及使用详解
2020/10/26 Python
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
美国销售第一的智能手机和平板电脑保护壳:OtterBox
2017/12/21 全球购物
介绍一下Python中webbrowser的用法
2013/05/07 面试题
园林设计师自荐信
2013/11/18 职场文书
花店创业计划书范文
2014/02/07 职场文书
银行职员个人的工作自我评价
2014/02/15 职场文书
火锅店营销方案
2014/02/26 职场文书
奠基仪式主持词
2014/03/20 职场文书
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
乔丹名人堂演讲稿
2014/05/24 职场文书
领导批评与自我批评范文
2014/10/16 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
公证书格式
2015/01/23 职场文书
检讨书格式
2019/04/25 职场文书
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS