python 图像分割_基于聚类的“图像分割”(python)

本文介绍了如何利用Python的PIL库和sklearn的KMeans算法进行图像分割。通过加载图片,预处理像素数据,应用KMeans聚类,然后将聚类结果转化为灰度图像进行保存,展示了图像处理的基本步骤。实验分析指出,KMeans算法需要多次尝试选择合适的k值,而层次聚类则能自动确定类别数。
摘要由CSDN通过智能技术生成

昨天萌新使用的是PIL这个库,今天发现机器学习也可以这样玩。

图像分割:利用图像的灰度、颜色、纹理、形状等特征,把图像分成若 干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区 域之间存在明显的差异性。然后就可以将分割的图像中具有独特性质的区域 提取出来用于不同的研究。

实现步骤:

1.建立工程并导入sklearn包

2.加载图片并进行预处理

3.加载Kmeans聚类算法

4.对像素点进行聚类并输出

实验代码

import numpy as np

import PIL.Image as image

from sklearn.cluster import KMeans

def load_data(file_path):

f = open(file_path,'rb') #二进制打开

data = []

img = image.open(f) #以列表形式返回图片像素值

m,n = img.size #活的图片大小

for i in range(m):

for j in range(n): #将每个像素点RGB颜色处理到0-1范围内并存放data

x,y,z = img.getpixel((i,j))

data.append([x/256.0,y/256.0,z/256.0])

f.close()

return np.mat(data),m,n #以矩阵型式返回data,图片大小

img_data,row,col = load_data('1.jpg')

label = KMeans(n_clusters=3).fit_predict(img_data) #聚类中心的个数为3

label = label.reshape([row,col]) #聚类获得每个像素所属的类别

pic_new = image.new("L",(row,col)) #创建一张新的灰度图保存聚类后的结果

for i in range(row): #根据所属类别向图片中添加灰度值

for j in range(col):

pic_new.putpixel((i,j),int(256/(label[i][j]+1)))

pic_new.save('111.jpg')

实验结果

v2-e788606412d18c1467352ff52fbabe2c_b.jpg

修改n_clusters的值会有不同结果

v2-f8d3abbc2458ed616cf0e702d8ac68a3_b.jpg

实验分析

通过设置不同的k值,能够得到不同的聚类结果。同时,k值的不确定也 是Kmeans算法的一个缺点。往往为了达到好的实验结果,需要进行多次尝 试才能够选取最优的k值。而像层次聚类的算法,就无需指定k值,只要给 定限制条件,就能自动地得到类别数k。

v2-73526b49e79396290e257e454a41dca8_b.jpg

话说把女朋友P成这样会不会被骂

v2-be5ad2e5212a2f9fb939e6803b07aaa5_b.jpg然而自己想太多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值