机器学习之无监督学习:基于聚类的整图分割
实现机理
- 图像分割:利用图像的灰度、颜色、纹理、形状等特征,把图像分为若干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区域内存在较明显的差异性。
- 常用方法:
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): #将每个像素点RGB颜色处理到0-1
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('img.png')
# 对像素点进行聚类并输出
km=KMeans(n_clusters=3)
# 聚类获得每一个像素点所属的类别
label=km.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)))
# 保存图像
pic_new.save('result.jpg',"JPEG")
本文来自博客园,作者:木子欢儿,转载请注明原文链接:https://www.cnblogs.com/HGNET/p/16843740.html