前言
任务:
加载本地图像1.jpg,建立Kmeans模型实现图像分割。
1、实现图像加载、可视化、维度转化,完成数据的预处理;
2、K=3建立Kmeans模型,实现图像数据聚类;
3、对聚类结果进行数据处理,展示分割后的图像;
4、尝试其他的K值(K=5、9),对比分割效果,并思考导致结果不同的原因;
5、使用新的图片,对其实现图像分割
KMeans实现图像分割实战summary:
kmeans算法的另外一种用处
1 加载图片
#图像加载与展示
import numpy as np
from skimage import io
img = io.imread('1.jpg')
from matplotlib import pyplot as plt
plt.imshow(img)
#查看图片存储后的数据类型与维度
print(type(img))
print(img.shape)
<matplotlib.image.AxesImage at 0x2563941c1c0>
<class 'numpy.ndarray'>
(500, 500, 3)
#查看数据内容
print(img)
#维度存储
img_width = img.shape[1]
img_height = img.shape[0]
print(img_width,img_height)
<matplotlib.image.AxesImage at 0x2563941c1c0>
<class 'numpy.ndarray'>
(500, 500, 3)
Output exceeds the size limit. Open the full output data in a text editor
[[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
...
...
...
[255 255 255]
[255 255 255]
[255 255 255]]]
500 500
#数据预处理 维度转化
img_data = img.reshape(-1,3)
print(img.shape,img_data.shape)
2. 模型建立
#X赋值
X = img_data
#模型建立
from sklearn.cluster import KMeans
model = KMeans(n_clusters=3,random_state=0)
print(model)
KMeans(n_clusters=3, random_state=0)
#模型训练
model.fit(X)
#结果预测
label = model.predict(X)
print(label)
#结果可视化
plt.imshow(label)
总结
1、使用skimage模块,实现了图像的加载、可视化,并完成数据预处理;
2、通过建立KMeans模型,实现了图像数据的聚类;
3、对图像聚类结果进行后续处理后,完成了图像分割,并将结果可视化;
4、尝试增大K值,观察发现随着K值增大分割后的图像将展现更多的细节信息
核心算法参考链接:https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html