圖像分割
圖像分割:利用圖像的灰度、顏色、紋理、形狀等特征,把圖像分成若干個互不重疊的區域,並使這些特征在同一區域內呈現相似性,在不同的區域之間存在明顯的差異性。然后就可以將分割的圖像中具有獨特性質的區域提取出來用於不同的研究。
圖像分割技術已在實際生活中得到廣泛的應用。例如:在機車檢驗領域,可以應用到輪轂裂紋圖像的分割,及時發現裂紋,保證行車安全;在生物醫學工程方面,對肝臟CT圖像進行分割,為臨床治療和病理學研究提供幫助。
圖像分割常用方法
閾值分割:對圖像灰度值進行度量,設置不同類別的閾值,達到分割的目的。
邊緣分割:對圖像邊緣進行檢測,即檢測圖像中灰度值發生跳變的地方,則為一片區域的邊緣。
直方圖法:對圖像的顏色建立直方圖,而直方圖的波峰波谷能夠表示一塊區域的顏色值的范圍,來達到分割的目的。
特定理論:基於聚類分析、小波變換等理論完成圖像分割。
實例描述
目標:利用K-means聚類算法對圖像像素點顏色進行聚類實現簡單的圖像分割。
輸出:同一聚類中的點使用相同顏色標記,不同聚類顏色不同。
技術路線:sklearn.cluster.KMeans
實例數據:本實例中的數據可以是任意大小的圖片,為了使效果更佳直觀,可以采用區分度比較明顯的圖片。
實驗過程
PIL包:因為本實驗涉及圖像的加載和創建,因此需要使用到PIL包。
實現步驟:
1、建立工程並導人sklearn包
2、加載圖片並進行預處理
3、加載Kmeans聚類算法
-
km = KMeans (n clusters=3 )
-
其中n_clusters屬性指定了聚類中心的個數為3
4、對像素點進行聚類並輸出
- 依據聚類中心,對屬於同一聚類的點使用同樣的顏色進行標記。
具體代碼
# 1、建立工程並導人sklearn包
import numpy as np
# 加載PIL包,用於加載創建圖片
import PIL.Image as image
# 加載KMeans算法
from sklearn.cluster import KMeans
# 2、加載圖片並進行預處理
# 加載訓練數據
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): # 范圍內並存放進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,以及圖片大小
imgData, row, col = loadData('1.jpg') # 加載數據
# 3、加載Kmeans聚類算法
# 聚成4類
km = KMeans(n_clusters=4)
# 4、對像素點進行聚類並輸出
# 用fit_predict()函數聚類獲得每個像素所屬的類別
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)))
# 以JPEG格式保存圖像
pic_new.save("result-4.jpg", "JPEG")
實驗分析
通過設置不同的k值,能夠得到不同的聚類結果。同時,k值的不確定也是Kmeans算法的一個缺點。往往為了達到好的實驗結果,需要進行多次嘗試才能夠選取最優的k值。而像層次聚類的算法,就無需指定k值,只要給定限制條件,就能自動地得到類別數k。
原始圖片:
-
聚成2類,km = KMeans(n_clusters=2)
-
聚成3類,km = KMeans(n_clusters=3)
-
聚成4類,km = KMeans(n_clusters=4)
最后的思考
-
因為本實驗涉及圖像的加載和創建,因此需要使用到PIL包,需要提前導入
-
剛開始寫完代碼,運行后會出現一個報錯
D:\pywork\venv\lib\site-packages\sklearn\utils\validation.py:585: FutureWarning: np.matrix usage is deprecated in 1.0 and will raise a TypeError in 1.2. Please convert to a numpy array with np.asarray. For more information see: https://numpy.org/doc/stable/reference/generated/numpy.matrix.html warnings.warn(
找了一下百度:matrix的用法在1.0中被棄用,並將在1.2中引發TypeError。請使用np.asarray轉換為numpy數組
查了一上午,解決辦法可以把numpy的版本降下來,在吃飯前發現,這個好像是個warning,不用管,其實結果以及跑出來了,氣死
-
圖片自己找,我放在了同文件夾下的,這樣路徑簡單
-
聚成的類自己定,定的n_clusters的數,會有不同的結果
自己導入PIL包
-
第一種:可以直接在pycharm里面,找到settings里的Python Interpreter,點+號自己加,名字是Pillow
-
第二種
- 在https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy 網站上找到自己python對應的版本的pillow,我下載的是Pillow-8.3.2-cp39-cp39-win_amd64.whl,
- 我放在python中的Scripts文件夾里
- 運行pip install Pillow-8.3.2-cp39-cp39-win_amd64.whl,進行安裝
- 具體差不多的下載方法,可以對照02SKlearn庫的安裝