python图像分割_基于K均值聚类算法的Python图像分割

zgtxtxxb-21-10-1402-1.jpg

1个K均值算法

实际上,K-means算法是一种非常简单的算法,与算法思想或特定实现无关. 通过以一定方式测量样本之间的相似度,并迭代更新聚类中心,它属于无监督分类. 当聚类中心不再移动或移动差异小于阈值时,将样本分为不同的类别.

1.1算法思想

随机选择群集中心. 根据当前聚类中心,使用选择的测量方法对所有样本点进行分类,以计算每个类别的样本点的平均值,作为下一次迭代的聚类中心. 当类中心和当前聚类中心之间的距离(例如4中的距离)小于给定的迭代阈值时,迭代结束. 否则,请继续下一次迭代,直到2

1.2测量方法

zgtxtxxb-21-10-1402-6.jpg

根据聚类中心,所有采样点均分为最相似的类别. 这需要有效的巩固,并且平方差是最常用的度量,方法如下

20191030105954644.png?201993011012

2应用于图像分割

我们知道,无论是灰度图像还是RGB彩像,它实际上都是具有灰度值的矩阵. 因此聚类 图像分割,图像数据格式确定图像分割的方向. K-means聚类算法非常简单,非常具体.

2.1代码

a482841f022040f88bf0ab1811556caa.jpg

导入必要的软件包

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)

分类器

20160921093947943.jpg

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均值算法的图像分割

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分类效果

20191030105730033.jpg?2019930105745

904258-20160310200608413-127189012.png

聚类中心数= 3,迭代阈值= 1 = 1

20191030105753019.jpg?2019930105832

聚类中心数= 3,迭代阈值= 1 = 1

4个GitHub

点击我

以上是本文的全部内容聚类 图像分割,希望对大家的学习有所帮助,并希望您支持脚本编写室.

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-184687-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值