基於聚類的“圖像分割”(python)


基於聚類的“圖像分割”

參考網站: https://zhuanlan.zhihu.com/p/27365576
昨天萌新使用的是PIL這個庫,今天發現機器學習也可以這樣玩。

視頻地址Python機器學習應用

圖像分割:利用圖像的灰度、顏色、紋理、形狀等特征,把圖像分成若 干個互不重疊的區域,並使這些特征在同一區域內呈現相似性,在不同的區 域之間存在明顯的差異性。然后就可以將分割的圖像中具有獨特性質的區域 提取出來用於不同的研究。

實現步驟:

1.建立工程並導入sklearn包

2.加載圖片並進行預處理

3.加載Kmeans聚類算法

4.對像素點進行聚類並輸出

實驗代碼

import numpy as np
import PIL.Image as image
from sklearn.cluster import KMeans

def load_data(file_path):
    f = open(file_path,'rb') #二進制打開
    data = []
    img = image.open(f) #以列表形式返回圖片像素值
    m,n = img.size #活的圖片大小
    for i in range(m):
        for j in range(n):  #將每個像素點RGB顏色處理到0-1范圍內並存放data
            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 #以矩陣型式返回data,圖片大小

img_data,row,col = load_data('1.jpg')
label = KMeans(n_clusters=3).fit_predict(img_data)  #聚類中心的個數為3
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('111.jpg')

實驗結果


修改n_clusters的值會有不同結果


實驗分析

通過設置不同的k值,能夠得到不同的聚類結果。同時,k值的不確定也 是Kmeans算法的一個缺點。往往為了達到好的實驗結果,需要進行多次嘗 試才能夠選取最優的k值。而像層次聚類的算法,就無需指定k值,只要給 定限制條件,就能自動地得到類別數k。


話說把女朋友P成這樣會不會被罵

然而自己想太多

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM