基於聚類的「圖像分割」(python)

基於聚類的「圖像分割」

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

視頻地址Python機器學習應用算法

圖像分割:利用圖像的灰度、顏色、紋理、形狀等特徵,把圖像分紅若 幹個互不重疊的區域,並使這些特徵在同一區域內呈現類似性,在不一樣的區 域之間存在明顯的差別性。而後就能夠將分割的圖像中具備獨特性質的區域 提取出來用於不一樣的研究。

實現步驟:

1.創建工程並導入sklearn包app

2.加載圖片並進行預處理機器學習

3.加載Kmeans聚類算法ide

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。3d


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

然而本身想太多視頻

相關文章
相關標籤/搜索