CV 聚類演算法

2021-10-12 17:16:56 字數 4710 閱讀 3073

分類與聚類分類

聚類聚類演算法的分類

層次聚類

密度聚類

k均值聚類(k-means)

第四步:將聚為一類的所有點求平均值,得到新的中心點

第五步:迴圈

三、四步,直到每一類的資料不再變化為止,就得到了我們想要的結果

優點:

缺點:

必須事先給出k值,而且對初始值比較敏感,對於不同的初始值,可能會導致不同的結果

不適合於發現凸形狀的簇或者大小差異很大的簇

對雜訊和孤立點資料敏感

應用點

**實現

彩色圖

# 彩色影象聚類

import cv2

import numpy as np

import matplotlib.pyplot as plt

# 讀取原影象

# 影象二維畫素轉為一維

data = img.reshape((-

1,3)

)print

(data.shape)

data = np.float32(data)

# 定義中心,

# cv2.term_criteria_eps 精確度滿足epsilon停止 1.0

# cv2.term_criteria_max_iter 迭代次數超過max_iter停止 10

# cv2.term_criteria_eps + cv2.term_criteria_max_iter 任意乙個滿足結束

criteria =

(cv2.term_criteria_eps + cv2.term_criteria_max_iter,10,

1.0)

# 設定標籤,隨機

flags = cv2.kmeans_random_centers

# 聚類標籤

# 引數:

# data:分類的資料

# k:要聚集的類

# bestlabels:預設分類標籤

# criteria:迭代規則

# attempts:重複試驗kmeans演算法次數,將會返回最好的一次結果。

# flags:初始類中心選擇cv2.kmeans_pp_centers 和 cv2.kmeans_random_centers

# 返回值:

# compactness:緊密度,返回每個點到相應重心的距離的平方和

# labels: 結果標記,每個成員被標記為0,1

# centers:由聚類的中心組成的陣列

# k-means聚類 聚集成2類

compactness, labels2, centers2 = cv2.kmeans(data,2,

none

,criteria,

10,flags)

# k-means聚類 聚集成4類

compactness, labels4, centers4 = cv2.kmeans(data,4,

none

,criteria,

10,flags)

# k-means聚類 聚集成8類

compactness, labels8, centers8 = cv2.kmeans(data,8,

none

,criteria,

10,flags)

# k-means聚類 聚集成16類

compactness, labels16, centers16 = cv2.kmeans(data,16,

none

,criteria,

10,flags)

# k-means聚類 聚集成64類

compactness, labels64, centers64 = cv2.kmeans(data,64,

none

,criteria,

10,flags)

# 影象轉回二維型別

centers2 = np.uint8(centers2)

res = centers2[labels2.flatten()]

# 將點分類類別的點都替換為中心點對應的畫素值

dst2 = res.reshape(

(img.shape)

)centers4 = np.uint8(centers4)

res = centers4[labels4.flatten()]

dst4 = res.reshape(

(img.shape)

)centers8 = np.uint8(centers8)

res = centers8[labels8.flatten()]

dst8 = res.reshape(

(img.shape)

)centers16 = np.uint8(centers16)

res = centers16[labels16.flatten()]

dst16 = res.reshape(

(img.shape)

)centers64 = np.uint8(centers64)

res = centers64[labels64.flatten()]

dst64 = res.reshape(

(img.shape)

)#影象轉換為rgb顯示

img = cv2.cvtcolor(img, cv2.color_bgr2rgb)

dst2 = cv2.cvtcolor(dst2, cv2.color_bgr2rgb)

dst4 = cv2.cvtcolor(dst4, cv2.color_bgr2rgb)

dst8 = cv2.cvtcolor(dst8, cv2.color_bgr2rgb)

dst16 = cv2.cvtcolor(dst16, cv2.color_bgr2rgb)

dst64 = cv2.cvtcolor(dst64, cv2.color_bgr2rgb)

#用來正常顯示中文標籤

plt.rcparams[

'font.sans-serif']=

['simhei'

]#顯示影象

titles =

[u'原始影象'

, u'聚類影象 k=2'

, u'聚類影象 k=4'

, u'聚類影象 k=8'

, u'聚類影象 k=16'

, u'聚類影象 k=64'

]images =

[img, dst2, dst4, dst8, dst16, dst64]

for i in

range(6

):plt.subplot(2,

3,i+1)

, plt.imshow(images[i]

,'gray'),

plt.title(titles[i]

) plt.xticks(

),plt.yticks(

)plt.show(

)

import cv2

import numpy as np

import matplotlib.pyplot as plt

# 讀取影象

)# 獲取影象的高度

rows,cols = img.shape[:]

# 影象二維畫素轉為一維

data = img.reshape(

(rows*cols,1)

)data = np.float32(data)

# 設定迭代規則 (type,max_iter,epsilon)

criteria =

(cv2.term_criteria_eps + cv2.term_criteria_max_iter,10,

1.0)

flags = cv2.kmeans_random_centers

# 聚類操作

compactness, labels, centers = cv2.kmeans(data,4,

none

,criteria,

10,flags)

# 生成影象

centers = np.uint8(centers)

res = centers[labels.flatten()]

dst = res.reshape(

(rows,cols)

)#用來正常顯示中文標籤

plt.rcparams[

'font.sans-serif']=

['simhei'

]#顯示影象

titles =

[u'原始影象'

, u'聚類影象'

]images =

[img, dst]

for i in

range(2

):plt.subplot(1,

2,i+1)

, plt.imshow(images[i]

,'gray'),

plt.title(titles[i]

) plt.xticks(

),plt.yticks(

)plt.show(

)

聚類演算法 近鄰聚類演算法

time is always too short for those who need it,but for those who love,it lasts forever.dracula untold 近鄰聚類法同樣是一種基於距離閾值的聚類演算法。coding utf 8 近鄰聚類演算法的pyth...

聚類演算法 層次聚類演算法

層次聚類演算法 hierarchical clustering method 又稱為系統聚類法 分級聚類法。層次聚類演算法又分為兩種形式 凝聚層次聚類 首先將每個物件作為乙個簇,然後合併這些原子簇為越來越大的簇,直到某個終結條件被滿足。層次聚類 首先將所有物件置於乙個簇中,然後逐漸細分為越來越小的簇...

聚類演算法 什麼是聚類

聚類分析或聚類演算法就是通過一些方法或手段使資料集集聚成不同的類別,或者叫 簇。簇內部每乙個單位都是相似的。簇與簇之間都是不相似的。但是聚類其實是一種思想,它不是一種具體的方法。這裡千萬不要搞混。但是可以實現聚類的演算法有很多種。我們通常就使用這些演算法來實現聚類的。比如 k means就是最為經典...