摘要:本篇文章主要講解基于理論的圖像分割方法,通過(guò)K-Means聚類算法實(shí)現(xiàn)圖像分割或顏色分層處理。
本文分享自華為云社區(qū)《[Python圖像處理] 十九.圖像分割之基于K-Means聚類的區(qū)域分割》,作者: eastmount。
10余年的花溪網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷型網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整花溪建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“花溪網(wǎng)站設(shè)計(jì)”,“花溪網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
本篇文章主要講解基于理論的圖像分割方法,通過(guò)K-Means聚類算法實(shí)現(xiàn)圖像分割或顏色分層處理?;A(chǔ)性文章,希望對(duì)你有所幫助。
注意 :該部分知識(shí)均為楊秀璋查閱資料撰寫(xiě),未經(jīng)授權(quán)禁止轉(zhuǎn)載,謝謝?。∪绻袉?wèn)題隨時(shí)私聊我,只望您能從這個(gè)系列中學(xué)到知識(shí),一起加油喔~
該系列在github所有源代碼:https://github.com/eastmountyxz/ImageProcessing-Python
第一部分知識(shí)主要參考自己的新書(shū)《Python網(wǎng)絡(luò)數(shù)據(jù)爬取及分析從入門(mén)到精通(分析篇)》和之前的博客[Python數(shù)據(jù)挖掘課程] 二.Kmeans聚類數(shù)據(jù)分析。
K-Means聚類是最常用的聚類算法,最初起源于信號(hào)處理,其目標(biāo)是將數(shù)據(jù)點(diǎn)劃分為K個(gè)類簇,找到每個(gè)簇的中心并使其度量最小化。該算法的最大優(yōu)點(diǎn)是簡(jiǎn)單、便于理解,運(yùn)算速度較快,缺點(diǎn)是只能應(yīng)用于連續(xù)型數(shù)據(jù),并且要在聚類前指定聚集的類簇?cái)?shù)。
下面是K-Means聚類算法的分析流程,步驟如下:
下圖是對(duì)身高和體重進(jìn)行聚類的算法,將數(shù)據(jù)集的人群聚集成三類。
在圖像處理中,通過(guò)K-Means聚類算法可以實(shí)現(xiàn)圖像分割、圖像聚類、圖像識(shí)別等操作,本小節(jié)主要用來(lái)進(jìn)行圖像顏色分割。假設(shè)存在一張100×100像素的灰度圖像,它由個(gè)RGB灰度級(jí)組成,我們通過(guò)K-Means可以將這些像素點(diǎn)聚類成K個(gè)簇,然后使用每個(gè)簇內(nèi)的質(zhì)心點(diǎn)來(lái)替換簇內(nèi)所有的像素點(diǎn),這樣就能實(shí)現(xiàn)在不改變分辨率的情況下量化壓縮圖像顏色,實(shí)現(xiàn)圖像顏色層級(jí)分割。
在OpenCV中,Kmeans()函數(shù)原型如下所示:
retval, bestLabels, centers = kmeans(data, K, bestLabels, criteria, attempts, flags[, centers])
下面使用該方法對(duì)灰度圖像顏色進(jìn)行分割處理,需要注意,在進(jìn)行K-Means聚類操作之前,需要將RGB像素點(diǎn)轉(zhuǎn)換為一維的數(shù)組,再將各形式的顏色聚集在一起,形成最終的顏色分割。
# coding: utf-8 import cv2 import numpyas np import matplotlib.pyplotas plt #讀取原始圖像灰度顏色 img= cv2.imread('scenery.png', 0) print img.shape #獲取圖像高度、寬度 rows, cols= img.shape[:] #圖像二維像素轉(zhuǎn)換為一維 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) #設(shè)置標(biāo)簽 flags= cv2.KMEANS_RANDOM_CENTERS #K-Means聚類 聚集成4類 compactness, labels, centers= cv2.kmeans(data, 4, None, criteria, 10, flags) #生成最終圖像 dst= labels.reshape((img.shape[0], img.shape[1])) #用來(lái)正常顯示中文標(biāo)簽 plt.rcParams['font.sans-serif']=['SimHei'] #顯示圖像 titles= [u'原始圖像', u'聚類圖像'] images= [img, dst] for i in xrange(2): plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()