圖像分割:利用圖像的灰度、顏色、紋理、形狀等特征,把圖像分成若干個互不重疊的區(qū)域,并使這些特征在同一區(qū)域內(nèi)呈現(xiàn)相似性,在不同的區(qū)域之間存在明顯的差異性。然后就可以將分割的圖像中具有獨特性質(zhì)的區(qū)域提取出來用于不同的研究。
1. 應(yīng)用
-
在機(jī)車檢驗領(lǐng)域,可以應(yīng)用到輪轂裂紋圖像的分割,及時發(fā)現(xiàn)裂紋,保證行車安全。
-
在生物醫(yī)學(xué)工程方面,對肝臟CT圖像進(jìn)行分割,為臨床治療和病理學(xué)研究提供幫助。
2. 圖像分割常用方法
-
閾值分割:對圖像灰度值進(jìn)行度量,設(shè)置不同類別的閾值,達(dá)到分割的目的。
-
邊緣分割:對圖像邊緣進(jìn)行檢測,即檢測圖像中灰度值發(fā)生跳變的地方,則為一片區(qū)域的邊緣。
-
直方圖法:對圖像的顏色建立直方圖,而直方圖的波峰波谷能夠表示一塊區(qū)域的顏色值的范圍,來達(dá)到分割的目的。
-
特定理論:基于聚類分析、小波變換等理論完成圖像分割。
3. 實例描述
-
目標(biāo):利用K-means聚類算法對圖像像素點顏色進(jìn)行聚類。
-
輸出:同一聚類中的點使用相同顏色標(biāo)記,不同聚類顏色不同。
-
導(dǎo)入Python模塊:from sklearn.cluster import KMeans
-
實例數(shù)據(jù):本實例中的數(shù)據(jù)可以是任意大小的圖片,為了使效果更佳直觀,可以采用區(qū)分度比較明顯的圖片。
4. 實驗過程
-
[ Step1 ] 建立工程并導(dǎo)入sklearn包
-
[ Step2 ] 加載圖片并進(jìn)行預(yù)處理
-
[ Step3 ] 加載K-means聚類算法
- [ Step4 ] 對像素點進(jìn)行聚類并輸出
Step1: 建立工程并導(dǎo)入sklearn包:PIL包: 因為本實驗涉及圖像的加載和創(chuàng)建,因此需要使用到 PIL 包。
-
創(chuàng)建Kmeans.py文件
-
導(dǎo)入sklearn相關(guān)包
import numpy as np
from PIL import Image #加載PIL包,用于加載創(chuàng)建圖片
from sklearn.cluster import KMeans #加載Kmeans算法
import matplotlib.pyplot as plt #繪制圖像
Step2: 加載圖片并進(jìn)行預(yù)處理:-
加載訓(xùn)練數(shù)據(jù)
def loadData(filePath):
f = open(filePath, 'rb') #以二進(jìn)制形式打開文件
data = []
img = Image.open(f) #以列表的形式返回圖片像素值
m, n = img.size #獲取圖片的大小
for i in range(m): #將每個像素點的RGB顏色處理到0-1
for j in range(n):
x,y,z = img.getpixel((i,j))
data.append([x/256.0, y/256.0, z/256.0]) #范圍內(nèi)并存入data
f.close()
return np.mat(data), m, n #以矩陣的形式返回data,以及圖片大小
Step3: 加載K-means聚類算法:-
選取聚類中心個數(shù)
#加載Kmeans聚類算法
km = KMeans(n_clusters= 3) #其中n clusters屬性指定了聚類中心的個數(shù)為3
Step4: 對像素點進(jìn)行聚類并輸出:-
對像素點進(jìn)行聚類并輸出心依據(jù)聚類中心,對屬于同一聚類的點使用同樣的顏色進(jìn)行標(biāo)記。
#聚類獲取每個像素所屬的類別
label = km.fit_predict(imgData)
label = label.reshape([row, col])
#創(chuàng)建一張新的灰度圖保存聚類后的結(jié)果
pic_new = Image.new('L', (row, col))
#根據(jù)所屬類別向圖片中添加灰度值
# 最終利用聚類中心點的RGB值替換原圖中每一個像素點的值,便得到了最終的分割后的圖片
for i in range(row):
for j in range(col):
pic_new.putpixel((i, j), int(256 / (label[i][j] + 1)))
#以JPEG格式保存圖片
pic_new.save("result_demo1.jpg","JPEG")
plt.imshow(pic_new)
plt.show()
5. 用例數(shù)據(jù)及展示結(jié)果
6.K-means聚類算法-程序代碼
# -*- coding: utf-8 -*-
# @Time : 2020/3/31 21:27
# @Author : Zudy
# @FileName: course1.py
'''
1.進(jìn)行圖像中顏色的分類(K-means聚類算法對圖像像素點顏色進(jìn)行聚類實現(xiàn)間的圖像分割)
'''
import numpy as np
from PIL import Image
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
def loadData(filePath):
f = open(filePath, 'rb') #以二進(jìn)制形式打開文件
data = []
img = Image.open(f) #以列表的形式返回圖片像素值
m, n = img.size #獲取圖片的大小
for i in range(m): #將每個像素點的RGB顏色處理到0-1
for j in range(n):
x,y,z = img.getpixel((i,j))
data.append([x/256.0, y/256.0, z/256.0]) #范圍內(nèi)并存入data
f.close()
return np.mat(data), m, n #以矩陣的形式返回data,以及圖片大小
path='./基于聚類的整圖分割/demo1.jpg'
imgData, row, col = loadData(filePath= path)
print(imgData)
print(row)
print(col)
#加載Kmeans聚類算法
km = KMeans(n_clusters= 3)
#聚類獲取每個像素所屬的類別
label = km.fit_predict(imgData)
label = label.reshape([row, col])
#創(chuàng)建一張新的灰度圖保存聚類后的結(jié)果
pic_new = Image.new('L', (row, col))
#根據(jù)所屬類別向圖片中添加灰度值
# 最終利用聚類中心點的RGB值替換原圖中每一個像素點的值,便得到了最終的分割后的圖片
for i in range(row):
for j in range(col):
pic_new.putpixel((i, j), int(256 / (label[i][j] + 1)))
#以JPEG格式保存圖片
pic_new.save("result_demo1.jpg","JPEG")
plt.imshow(pic_new)
plt.show()
實驗分析通過設(shè)置不同的k值,能夠得到不同的聚類結(jié)果。同時,k值的不確定也是Kmeans算法的一個缺點。往往為了達(dá)到好的實驗結(jié)果,需要進(jìn)行多次嘗試才能夠選取最優(yōu)的k值。
-
圖像分割
+關(guān)注
關(guān)注
4文章
182瀏覽量
18024 -
聚類算法
+關(guān)注
關(guān)注
2文章
118瀏覽量
12142 -
K-means
+關(guān)注
關(guān)注
0文章
28瀏覽量
11319
原文標(biāo)題:[sklearn]基于K-means聚類算法的圖像分割
文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論