OpenCV-Python教程:55.OpenCV里的K-Means聚類

理解參數(shù)

輸入?yún)?shù)

1.samples:應(yīng)該是np.float32數(shù)據(jù)類型足陨,且每個(gè)特征應(yīng)該放在一個(gè)單獨(dú)的列症脂。

2.nclusters(K): 需要的聚類的數(shù)量

3.criteria: 這是迭代終止準(zhǔn)則忘渔。當(dāng)滿足這個(gè)準(zhǔn)則時(shí)婚陪,算法迭代停止棍丐。實(shí)際上,它應(yīng)該是一個(gè)3個(gè)參數(shù)的元組茉兰。他們是:(type, max_iter, epsilon):

? ? ·3.a - 終止準(zhǔn)則的類型: 有3個(gè)標(biāo)志如下:

? ? ? ? cv2.TERM_CRITERIA_EPS - 如果滿足了指定準(zhǔn)確度尤泽,epsilon就停止算法迭代。
? ? ? ? cv2.TERM_CRITERIA_MAX_ITER - 在指定次數(shù)的迭代后就停止算法规脸。

? ? ? ? cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER - 當(dāng)任何上面的條件滿足就停止迭代

? ? ·3.b - max_iter - 指定最大的迭代次數(shù)坯约,整數(shù)

? ? ·3.c - epsilon - 需要的準(zhǔn)確度

4.attempts: 標(biāo)志,指定算法使用不同初始標(biāo)簽執(zhí)行的次數(shù)莫鸭。算法返回能得到最好密度的標(biāo)簽闹丐。密度作為輸出被返回。

5.flags:這個(gè)標(biāo)志是用來指定如何得到初始中心的被因。一般兩個(gè)標(biāo)志會(huì)用到:cv2.KMEANS_PP_CENTERS和cv2.KMEANS_RANDOM_CENTERS.

輸出參數(shù)

1.compactness: 這是從每個(gè)點(diǎn)到他們對(duì)應(yīng)的中心的距離的平方和卿拴。

2.labels: 這是標(biāo)簽數(shù)組(和'code'一樣),每個(gè)元素被標(biāo)記為'0', '1'...

3.centers: 這是聚類中心的數(shù)組

現(xiàn)在我們用三個(gè)例子看看怎么應(yīng)用K-Means算法

1.只有一個(gè)特征的數(shù)據(jù)

你有一個(gè)只有一個(gè)特征或者一個(gè)維度的數(shù)據(jù)集梨与,比如堕花,我們你只能用人的身高來決定T恤的尺寸。

所以我們創(chuàng)建數(shù)據(jù)并用Matplotlib繪制:

import numpy as np
import cv2
from matplotlib import pyplot as plt

x = np.random.randint(25,100,25)
y = np.random.randint(175,255,25)
z = np.hstack((x,y))
z = z.reshape((50,1))
z = np.float32(z)
plt.hist(z,256,[0,256]),plt.show()

所以我們的'z'是一個(gè)大小為50的數(shù)組粥鞋,值的范圍從0到255缘挽。我們把'z'變形成列向量。當(dāng)超過一個(gè)特征被顯示時(shí)很有用呻粹。那么我們把數(shù)據(jù)變成np.float32類型壕曼。

現(xiàn)在我們使用KMeans函數(shù)。在此之前我們需要制定criteria等浊。我們的criteria是當(dāng)10次算法迭代或者準(zhǔn)確度epsilon=1.0滿足時(shí)窝稿,停止算法并返回結(jié)果。

# Define criteria = ( type, max_iter = 10 , epsilon = 1.0 )
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)

# Set flags (Just to avoid line break in the code)
flags = cv2.KMEANS_RANDOM_CENTERS

# Apply KMeans
compactness,labels,centers = cv2.kmeans(z,2,None,criteria,10,flags)

這給我們密度凿掂,標(biāo)簽和中心,在這個(gè)例子里纹蝴,我們得到中心60和207. 標(biāo)簽會(huì)有和測(cè)試數(shù)據(jù)相同的大小庄萎,每個(gè)數(shù)據(jù)會(huì)根據(jù)他們的質(zhì)心被標(biāo)記為'0', '1', '2'。現(xiàn)在我們根據(jù)標(biāo)簽把數(shù)據(jù)分為不同的聚類塘安。

A = z[labels==0]
B = z[labels==1]

現(xiàn)在我們用紅色畫出A用藍(lán)色畫B糠涛,他們的質(zhì)心用黃色

# Now plot 'A' in red, 'B' in blue, 'centers' in yellow
plt.hist(A,256,[0,256],color = 'r')
plt.hist(B,256,[0,256],color = 'b')
plt.hist(centers,32,[0,256],color = 'y')
plt.show()

下面是我們的輸出:

2. 多個(gè)特征的數(shù)據(jù)

在前面的例子里,我們對(duì)于T恤問題只取身高兼犯。這里忍捡,我們?nèi)∩砀吆腕w重兩個(gè)特征集漾。

記住,在前面的例子里砸脊,我們把我們的數(shù)據(jù)弄成單列向量具篇。每個(gè)特征作為一列。每行對(duì)應(yīng)一個(gè)輸入測(cè)試樣本凌埂。

例如驱显,在這個(gè)例子里,我們?cè)O(shè)置一個(gè)大小為50x2的測(cè)試數(shù)據(jù)瞳抓,是50個(gè)人的身高和體重埃疫。第一列對(duì)應(yīng)著所有50個(gè)人的身高,第二列對(duì)應(yīng)他們的體重孩哑。第一行包含兩個(gè)元素栓霜,第一個(gè)元素是第一個(gè)人的身高,第二個(gè)元素是他的體重横蜒,類似的剩下的行對(duì)應(yīng)剩下的人的身高和體重胳蛮。看下圖:

現(xiàn)在我們直接看代碼:

import numpy as np
import cv2
from matplotlib import pyplot as plt

X = np.random.randint(25,50,(25,2))
Y = np.random.randint(60,85,(25,2))
Z = np.vstack((X,Y))

# convert to np.float32
Z = np.float32(Z)

# define criteria and apply kmeans()
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
ret,label,center=cv2.kmeans(Z,2,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)

# Now separate the data, Note the flatten()
A = Z[label.ravel()==0]
B = Z[label.ravel()==1]

# Plot the data
plt.scatter(A[:,0],A[:,1])
plt.scatter(B[:,0],B[:,1],c = 'r')
plt.scatter(center[:,0],center[:,1],s = 80,c = 'y', marker = 's')
plt.xlabel('Height'),plt.ylabel('Weight')
plt.show()

下面是輸出:

3.顏色量化

顏色量化是減少一個(gè)圖像里的顏色數(shù)量的過程愁铺。做這個(gè)的一個(gè)原因是減少內(nèi)存使用鹰霍。有時(shí)候,一些設(shè)備會(huì)受限只能生成有限的顏色數(shù)量茵乱。在那些情況下也會(huì)執(zhí)行顏色量化茂洒。這里我們使用k-means聚類來做顏色量化。

沒有新的內(nèi)容要解釋瓶竭。這里有3個(gè)特征督勺,R,G,B。所以我們需要把圖像改造成Mx3大小的數(shù)組(M是圖像像素的數(shù)量)斤贰。聚類之后智哀,我們應(yīng)用中心值到所有的像素上,這樣結(jié)果圖像會(huì)有指定數(shù)量的顏色荧恍。再次我們需要把它變形回去變成原始圖片的形狀瓷叫。下面是代碼:

import numpy as np
import cv2

img = cv2.imread('home.jpg')
Z = img.reshape((-1,3))

# convert to np.float32
Z = np.float32(Z)

# define criteria, number of clusters(K) and apply kmeans()
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 8
ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)

# Now convert back into uint8, and make original image
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((img.shape))

cv2.imshow('res2',res2)
cv2.waitKey(0)
cv2.destroyAllWindows()

看下面K=8時(shí)的結(jié)果:

END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市送巡,隨后出現(xiàn)的幾起案子摹菠,更是在濱河造成了極大的恐慌,老刑警劉巖骗爆,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件次氨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡摘投,警方通過查閱死者的電腦和手機(jī)煮寡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門虹蓄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人幸撕,你說我怎么就攤上這事薇组。” “怎么了杈帐?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵体箕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我挑童,道長(zhǎng)累铅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任站叼,我火速辦了婚禮娃兽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尽楔。我一直安慰自己投储,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布阔馋。 她就那樣靜靜地躺著玛荞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呕寝。 梳的紋絲不亂的頭發(fā)上勋眯,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音下梢,去河邊找鬼客蹋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛孽江,可吹牛的內(nèi)容都是我干的讶坯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼岗屏,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼辆琅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起这刷,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤婉烟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后崭歧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撞牢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年率碾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叔营。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡所宰,死狀恐怖绒尊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仔粥,我是刑警寧澤婴谱,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站躯泰,受9級(jí)特大地震影響谭羔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜麦向,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一瘟裸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诵竭,春花似錦话告、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至裳朋,卻和暖如春病线,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背再扭。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工氧苍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泛范。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓让虐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親罢荡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赡突,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容