基于聚类K-Means方法实现图像分割
”“”K-Means to realize Image segmentation “”“
import numpy as np
import PIL.Image as image
from sklearn.cluster import KMeans
#Define loadDato to solve my image
def loadData(filePath):
f = open(filePath,'rb')#deal with binary
data = []
img = image.open(f)#return to pixel(像素值)
m,n = img.size#the size of image
for i in range(m):
for j in range(n):
x,y,z = img.getpixel((i,j))
#deal with pixel to the range 0-1 and save to data
data.append([x/256.0,y/256.0,z/256.0])
f.close()
return np.mat(data),m,n imgData,row,col = loadData("./picture/apple.png")
#setting clusers(聚类中心) is 3
label = KMeans(n_clusters=3).fit_predict(imgData)
#get the label of each pixel
label = label.reshape([row,col])
#create a new image to save the result of K-Means
pic_new = image.new("L",(row,col))
#according to the label to add the pixel
for i in range(row):
for j in range(col):
pic_new.putpixel((i,j),int(256/(label[i][j]+1)))
pic_new.save("./picture/km.jpg","JPEG")
K-Means算法:
我们常说的K-Means算法属于无监督分类(训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质和规律,为进一步的数据分析提供基础),它通过按照一定的方式度量样本之间的相似度,通过迭代更新聚类中心,当聚类中心不再移动或移动差值小于阈值时,则就样本分为不同的类别。聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个”簇“,通过这样的划分,每个簇可能对应于一些潜在的类别。
算法实现步骤:
- 随机选取聚类中心
- 根据当前聚类中心,利用选定的度量方式,分类所有样本点
- 计算当前每一类的样本点的均值,作为下一次迭代的聚类中心
- 计算下一次迭代的聚类中心与当前聚类中心的差距,若差距小于迭代阈值时,迭代结束。
算法伪代码:
其中,D为样本集,聚类所得簇划分为C
图像分割实验:利用图像的灰度、颜色、纹理、形状等特征,把图像分成若 干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区 域之间存在明显的差异性。然后就可以将分割的图像中具有独特性质的区域 提取出来用于不同的研究。本次实验我们将apple聚类中心设置n_clusters=3,cat聚类中心设置为2
1、实验步骤
- 建立kms.py工程并导入所需python包
- 加载本地图片进行预处理
- K-Means聚类算法实现
- 聚类像素点并保存输出
2、实验数据
测试image:
3、实验结果
3、实验总结
在本次实验中,我们通过设置不同的聚类中心,从而得到不同的聚类结果。如果想要得到预想的效果,必须多次尝试,这使得K值具有不确定性,不利于我们操作。
在进行本次实验时,遇到如下问题:
(1)IndentationError: unindent does not match any outer indentation level
(2)ValueError: cannot reshape array of size 500 into shape (500,500)
问题解决:
这两个问题出现的原因均是对其python格式对齐出现问题,f的打开和f的关闭应该对齐,而报错的原因也恰在这里。一般(2)的报错原因最多可能是数据格式有问题,但在考虑数据格式有问题的时候,首先查看代码格式是否正确。
基于聚类K-Means方法实现图像分割的更多相关文章
- kaggle信用卡欺诈看异常检测算法——无监督的方法包括: 基于统计的技术,如BACON *离群检测 多变量异常值检测 基于聚类的技术;监督方法: 神经网络 SVM 逻辑回归
使用google翻译自:https://software.seek.intel.com/dealing-with-outliers 数据分析中的一项具有挑战性但非常重要的任务是处理异常值.我们通常将异 ...
- 基于聚类的“图像分割”(python)
基于聚类的“图像分割” 参考网站: https://zhuanlan.zhihu.com/p/27365576 昨天萌新使用的是PIL这个库,今天发现机器学习也可以这样玩. 视频地址Python机器学 ...
- 浅谈分词算法(4)基于字的分词方法(CRF)
目录 前言 目录 条件随机场(conditional random field CRF) 核心点 线性链条件随机场 简化形式 CRF分词 CRF VS HMM 代码实现 训练代码 实验结果 参考文献 ...
- 浅谈分词算法(3)基于字的分词方法(HMM)
目录 前言 目录 隐马尔可夫模型(Hidden Markov Model,HMM) HMM分词 两个假设 Viterbi算法 代码实现 实现效果 完整代码 参考文献 前言 在浅谈分词算法(1)分词中的 ...
- 了解移动用户的隐私期望:一种基于推荐的Crowdsourcing方法
应学习之需,最近一段时间阅读了一篇论文,特写下总结,若有纰漏,还望指出. 目录 引言 推荐机制 实现 评估 心得 1.1 为什么要了解移动用户的隐私期望 1.移动设备的广泛使用存在一些潜在的隐私威胁和 ...
- 浅谈分词算法基于字的分词方法(HMM)
前言 在浅谈分词算法(1)分词中的基本问题我们讨论过基于词典的分词和基于字的分词两大类,在浅谈分词算法(2)基于词典的分词方法文中我们利用n-gram实现了基于词典的分词方法.在(1)中,我们也讨论了 ...
- 知识图谱实体对齐2:基于GNN嵌入的方法
知识图谱实体对齐2:基于GNN嵌入的方法 1 导引 我们在上一篇博客<知识图谱实体对齐1:基于平移(translation)嵌入的方法>中介绍了如何对基于平移嵌入+对齐损失来完成知识图谱中 ...
- Spring AOP基于配置文件的面向方法的切面
Spring AOP基于配置文件的面向方法的切面 Spring AOP根据执行的时间点可以分为around.before和after几种方式. around为方法前后均执行 before为方法前执行 ...
- 基于TODO的开发方法
之前买了一本书,叫<架构探险-从零开始写Java Web框架 >(不推荐购买-),一本标题党书籍!但是我很推崇作者写代码的方式,就是基于TODO的方式进行开发! 个人认为以基于TODO的方 ...
- 浅谈分词算法(5)基于字的分词方法(bi-LSTM)
目录 前言 目录 循环神经网络 基于LSTM的分词 Embedding 数据预处理 模型 如何添加用户词典 前言 很早便规划的浅谈分词算法,总共分为了五个部分,想聊聊自己在各种场景中使用到的分词方法做 ...
随机推荐
- 在docker容器中编译hadoop 3.1.0
在docker容器中编译hadoop 3.1.0 优点:docker安装好之后可以一键部署编译环境,不用担心各种库不兼容等问题,编译失败率低. Hadoop 3.1.0 的源代码目录下有一个 `sta ...
- 小程序 之wx.request和wx.showModal简单封装
一.request封装 request(url, data, successCallBack = function(data) {}, completeCallBack = function(data ...
- git前期准备
git小结 设置用户名 git config –global user.name 'itcast' 设置用户名邮箱 git config –global user.email 'itcast' 查看设 ...
- ArcGIS10.3_解决属性表中文乱码问题
借鉴前辈们解决ArcMap低版本属性表乱码的问题解决方法,勇敢的尝试了一下Pro中的解决方法,其实道理都一样.先来看看第一种方法:打开CMD,如果是ArcMap,输入如下命令: reg add HKE ...
- git sub module
https://github.com/ViRb3/de4dot-cex/blob/master/.gitmodules git submodule sync command - what is it ...
- Flutter移动电商实战 --(53)购物车_商品列表UI框架布局
cart_page.dart 清空原来写的持久化的代码; 添加对应的引用,stless生成一个静态的类.建议始终静态的类,防止重复渲染 纠正个错误,上图的CartPage单词拼错了,这里改过来防止后面 ...
- Flutter移动电商实战 --(50)持久化_shared_preferences
当app关掉了.再进去的时候 ,购物车的内容还是存在. sqflite提供这个来操作SQLite数据库 flutter提供三种持久化的工具 今天要学的就是 shared_preferences 还有一 ...
- Struts2 入门笔记
一.介绍 1.Struts网站 https://struts.apache.org/ struts 是通过基于请求响应模式的应用framework 1) 控制器(Controller)--控制整个Fr ...
- windows系统下Jenkins 持续集成安装使用
先要下载安装Tomcat,基于Java的web项目可以通过Tomcat运行.下载Jenkins,注意要安装在Tomcat的webapps目录下.安装完Jenkins会自动通过浏览器打开http://l ...
- layui问题之模拟select点击事件
一.问题 不操作页面,实现模拟select的事件,即,自动出现下拉框,自动点击下拉框的值,select文本框的值随之改变 二.经过 刚开始查看layui官方文档,发现仅仅只是有select监听事件,即 ...