机器学习之无监督学习:基于聚类的整图分割

实现机理

  • 图像分割:利用图像的灰度、颜色、纹理、形状等特征,把图像分为若干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区域内存在较明显的差异性。
  • 常用方法:
    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")

 

posted @ 2022-10-31 11:31  木子欢儿  阅读(134)  评论(0编辑  收藏  举报