前置准备
详情请见我的上一篇博客
基于聚类的图像分割
实现机理
- 图像分割:利用图像的灰度、颜色、纹理、形状等特征,把图像分为若干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区域内存在较明显的差异性。
- 常用方法:
1.阈值分割:对图像灰度值进行测量,设置不同种类的阈值,达到分割的目的。
2.边缘分割:对图像边缘进行检测,检测图像中灰度值发生跳变的地方,即为一片区域的边缘。
3.直方图法:对图像的颜色建立直方图,而直方图的波峰波谷能够表示一块区域的颜色值的范围,来达到聚类分析的目的。
4.特定理论:基于聚类分析、小波变换等理论完成图像分割。
效果图
- 原图
- 效果图
源代码
import numpy as np
import PIL.Image as image
from sklearn.cluster import KMeans
def loadData(filePath): #读取文件
f = open(filePath, 'rb') #二进制方式打开图片文件
data = []
img = image.open(f)
m,n = img.size
for i in range(m):
for j in range(n):
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
imgData,row,col = loadData('picture.jpg')
label = KMeans(n_clusters=4).fit_predict(imgData) #KMeans方法创建实例,聚类中心个数为4
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("result-picture-4.jpg", "JPEG") #输出结果
注:本文是博主机器学习课程的心得总结,不支持任何商用且不支持转载!如果你也对机器学习有一定的兴趣和理解,欢迎随时找博主交流~