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