一、
实验目的
• 1
、理解无监督学习中
Kmeans
算法原理
• 2
、掌握
Sklearn
实现基于
Kmeans
的图像分割
二、
实验内容与要求
1
、该代码属于无监督学习
,
使用了
K-means
聚类算法。无监督学习
是一种无需标签的学习方法,模型从数据的内部结构中学习,将数据
分组或聚类。
2
、核心函数:
·
KMeans(n_clusters=4).fit_predict(imgData)
输入:归一化后的图像数据
imgData
。
输出:每个像素点所属的簇标签数组
label
,其中每个标签表示该
像素属于哪个聚类簇。
·
loadData(filePath)
输入:图像文件的路径
filePath
。
输出:一个包含归一化后的像素
RGB
值的
NumPy
数组
data
,以
及图像的宽度
m
和高度
n
。
以上代码使用了无监督学习中的
K-means
聚类算法对图像进行颜
色聚类和分割。首先,加载并处理图像数据;然后使用
K-means
算法
对像素进行聚类;最后根据聚类结果重新生成和保存处理后的图像。
3
、图像分割
利用图像的灰度、颜色、纹理、形状等特征,把图像分成若干个互
不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区
域之间存在明显的差异性。然后就可以将分割的图像中具有独特性质
的区域提取出来用于不同的研究。
图像分割技术已在实际生活中得到广泛的应用。例如
:
在机车检验领
域,可以应用到轮毂裂纹图像的分割,及时发现裂纹,保证行车安全
;
在生物医学工程方面,对肝脏
CT
图像进行分割,为临床治疗和病理学
研究提供帮助。
4
、实例描述
目标
:
利用
K-means
聚类算法对图像像素点颜色进行聚类实现简单
的图像分割
输出
:
同一聚类中的点使用相同颜色标记,不同聚类颜色不同
5
、实验过程
·使用算法
:Kmeans
·实现步骤
:
(
1
)建立工程并导入
sklearn
包
(
2
)加载图片并进行预处理
(
3
)加载
Kmeans
聚类算法
(
4
)对像素点进行聚类并输出
三、 实验程序与结果
import
numpy
as
np
#
用于处理处理数值计算和数组操作
import
PIL.Image
as
image
#Python Imaging Library
,用于处理图像数据
from
sklearn.cluster
import
KMeans
#
执行
K-means
聚类
def
loadData
(filePath):
#
打开指定路径的图像文件并读取其内容。
f =
open
(filePath,
'rb'
)
#
打开图像文件,获取尺寸
data = []
#
存储归一化后的像素值
img = image.open(f)
#
使用
PIL
库打开图像
m, n = img.size
#
获取图像的尺寸(宽度和高度)
#
遍历图像的每个像素点,获取其
RGB
值并归一化到
[0, 1]
范围内。
for
i
in
range
(m):
#
图像的宽度
for
j
in
range
(n):
#
图像的高度
x, y, z = img.getpixel((i, j))
#
获取像素点
(i, j)
处的
RGB
值
data.append([x /
256.0
, y /
256.0
, z /
256.0
])
#
归一化像素值并存储
f.close()
#
关闭文件
return
np.array(data), m, n
#
返回归一化后的像素值数组和图像尺寸,
np.array
,包含归
一化后像素值的数组
#
加载并处理图像数据,函数加载图像数据,并获取图像的行数
row
和列数
col
。
imgData, row, col = loadData(
'
处理之前的图片
.jpg'
)
#
使用
K-means
聚类算法对图像进行颜色聚类,得到每个像素点所属的簇标签
label = KMeans(
n_clusters
=
4
).fit_predict(imgData)
#
将聚类标签重塑为与原图像尺寸相同的矩阵,将一维的聚类标签数组重塑为二维矩阵
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
)))
#
将处理后的图像保存为
JPEG
格式文件
pic_new.save(
"
处理后的图片
.jpg"
,
"JPEG"
)
四、实验结果分析
![](https://img-blog.csdnimg.cn/direct/05a16fb61d9340c4a12081e41a927f32.png)
原始图像展示了图像的所有细节和颜色,包含大量的颜色信息和细
节。分割后的图像使用
4
个聚类中心颜色替换原图中的颜色,从而将
图像简化为
4
个主要颜色区域。这些颜色区域代表了图像中的主要颜
色成分,去除了细节颜色的干扰,使图像更加简洁,突出了主要颜色
区域。
聚类效果依赖于图像的内容和颜色分布。对于颜色差异明显的图
像,聚类效果较好,可以清晰地区分不同颜色区域。对于颜色渐变和
细节丰富的图像,聚类可能会导致一些细节丢失,但仍能突出主要颜
色区域。
五、实验问题解答与体会
通过本次实验,我深刻体会到了图像处理的基础知识和
K-means
聚
类算法在图像分割中的实际应用。加载图像、处理像素值和转换图像
格式的过程加深了我对图像处理技术的理解。通过实施
K-means
聚类
算法,对图像像素进行颜色聚类,并将聚类结果应用于图像分割,使
我直观地理解了聚类算法的原理和效果。
此外,通过对实验结果的分析,我认识到
K-means
聚类在图像分割
中的应用效果较好,但仍有改进空间,如调整聚类数量和进行图像的
预处理与后处理