python基于K-means聚类算法的图像分割
作者:iwuqing 发布时间:2021-03-30 02:29:05
标签:python,K-means,图像分割
1 K-means算法
实际上,无论是从算法思想,还是具体实现上,K-means算法是一种很简单的算法。它属于无监督分类,通过按照一定的方式度量样本之间的相似度,通过迭代更新聚类中心,当聚类中心不再移动或移动差值小于阈值时,则就样本分为不同的类别。
1.1 算法思路
随机选取聚类中心
根据当前聚类中心,利用选定的度量方式,分类所有样本点
计算当前每一类的样本点的均值,作为下一次迭代的聚类中心
计算下一次迭代的聚类中心与当前聚类中心的差距
如4中的差距小于给定迭代阈值时,迭代结束。反之,至2继续下一次迭代
1.2 度量方式
根据聚类中心,将所有样本点分为最相似的类别。这需要一个有效的盘踞,平方差是最常用的度量方式,如下
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 分类效果
聚类中心个数=3,迭代阈值为=1
聚类中心个数=3,迭代阈值为=1
4 GitHub
click me
来源:https://www.jianshu.com/p/11d7cde4944d


猜你喜欢
- 如果你看过YUI的RAW源码,会发现很多跟javadoc语法类似的注释。据说(via)是使用JSDoc这个工具。但我探索了一遍,发现YUI多
- Python写倒序输出(任意位数)倒序输出数字这种方法最后输出的是字符而不是数字x=int(input('请输入任意一个数字:
- 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技
- 创建主键可以有两种方式:create table 表名(字段名 类型,字段名 类型,……primary key(name));或者是crea
- 代码如下:<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001&quo
- 注释标注解释,目的是帮助读者理解的文本也就是说,注释首先是文本,其二是说明,其三是思路,其四是例子注释有两种形式1. # ... 单行注释用
- 在对二维数据进行 resize / mapping / 坐标转换等操作时,经常会将原本的整数坐标变换为小数坐标,对于非整数的坐标值一种直观有
- Pandas函数的核心功能是,既计算了统计值,又保留了明细数据。为了更好地理解transform和agg的不同,下面从实际的应用场景出发进行
- 1、python代码实现图片分割成九宫格需要包含的库,没有下载安装的,需要自己安装哦。实现原理很简单,就是用PIL库不断画小区域,切下来存储
- 资源React-16.8.*react-router-dom-4.3.*TypeScript-3.5.*webpack-4.*eslint-
- 本文实例分析了Go语言中关闭带缓冲区的频道。分享给大家供大家参考。具体分析如下:Go语言提供了两种频道,带缓冲区和不带缓冲区的。不带缓冲区的
- 本文实例讲述了Python基于辗转相除法求解最大公约数的方法。分享给大家供大家参考,具体如下:之前总结过一次高德纳TAOCP中的最大公约数求
- 1)doctest 使用doctest是一种类似于命令行尝试的方式,用法很简单,如下 def f(n): ""
- 我们要先配置npm的全局模块的存放路径以及cache的路径,例如我希望将以上两个文件夹放在nodejs的主目录下,便在nodejs下建立”n
- 目录什么是传值(值传递)什么是传引用(引用传递)迷惑Mapchan类型和map、chan都不一样的slice小结对于了解一门语言来说,会关心
- 1、查看数据库中有哪些用户? select username from all_users;2、查看数据库中有哪些DBA用户? select
- 如果您还不太了解XML技术,您可以先看看此文:XML的语法、结构以及相关的一些技术 及 XML DOM介绍和例子XML中 CDATA的作用:
- 花了两个多钟在看 ThinkPHP 框架,不想太过深入的知道它的所有高深理论。单纯想知道怎么可以用起来,可以快捷的搭建一个网站。所以是有选择
- 容我废话一下最近几个月,毒教材被曝光引发争议,那些编写度教材的人着实可恶。咱程序员也没有手绘插画能力,但咱可以借助强大的深度学习模型将视频转
- 前言同步适合多个连续执行的,每一步的执行依赖于上一步操作,异步执行则和任务执行顺序无关(如从10个站点抓取数据)同步执行类RunnerAsy