劉 衣,游繼安
(湖北工程學(xué)院 新技術(shù)學(xué)院,湖北 孝感 432000)
模糊C均值聚類圖像分割算法的C++實(shí)現(xiàn)
劉 衣,游繼安
(湖北工程學(xué)院 新技術(shù)學(xué)院,湖北 孝感 432000)
利用C++語言和OPENCV仿真工具,實(shí)現(xiàn)了模糊C均值聚類算法的圖像分割?;仡櫫四:鼵均值聚類算法的原理,詳細(xì)說明了如何將聚類算法和圖像分割進(jìn)行關(guān)聯(lián)。描述了整個(gè)仿真的每一個(gè)函數(shù)的算法原理和流程,對比分析了不同圖像分割的實(shí)驗(yàn)結(jié)果,最后探討了模糊C均值聚類算法需要改進(jìn)的一些問題。
C++;OPENCV;模糊C均值;聚類;圖像分割
圖像分割是目標(biāo)跟蹤、車輛自動(dòng)駕駛等技術(shù)的基礎(chǔ),是圖像處理技術(shù)的一個(gè)研究熱點(diǎn)。目前圖像分割問題沒有一種普遍適用的求解算法,一般只能針對不同領(lǐng)域中的問題設(shè)計(jì)不同的算法[1]。圖像分割可分為基于層次的分割和基于塊的分割,基于塊的分割方法又可分為基于區(qū)域的分割和基于邊緣或邊界的分割。本文研究基于區(qū)域分割的圖像分割問題[1]。另外,模糊聚類廣泛應(yīng)用在遠(yuǎn)程感知、醫(yī)學(xué)圖片等領(lǐng)域。在圖像分割中,模糊C均值聚類算法是一種應(yīng)用最廣泛的聚類算法,常用于數(shù)據(jù)挖掘、機(jī)器視覺等領(lǐng)域。傳統(tǒng)的模糊C均值算法對大多數(shù)無噪聲圖片的分割很有效[2]。于是,很多方法都以模糊C均值算法為基礎(chǔ),對其加以改進(jìn)以適應(yīng)某些圖像分割,如利用遷移學(xué)習(xí)改進(jìn)的知識(shí)杠桿遷移模糊C均值(KL-TFCM)算法[3],等等。
本文利用C++語言和OPENCV工具,在VS2015平臺(tái)上進(jìn)行了編程,分別從初始聚類數(shù)、灰度和彩色維度探討了實(shí)驗(yàn)結(jié)果。
FCM聚類算法的目標(biāo)函數(shù)可描述為式(1):
(1)
(2)
(3)
為了便于編程,對式(2)進(jìn)行變換可得式(4):
(4)
(1)設(shè)置目標(biāo)函數(shù)精度ε,模糊指數(shù)m(通常取值為2),最大迭代次數(shù)maxTimes;
(2)初始化模糊聚類中心P;
(3)由公式(4)和(3)分別更新隸屬度矩陣和聚類中心,若樣本點(diǎn)和聚類中心的距離為0,則將該點(diǎn)與相對應(yīng)類的隸屬度值設(shè)為1;
(4)計(jì)算每個(gè)樣本點(diǎn)到每個(gè)類的聚類中心的距離,并按照公式(1)計(jì)算目標(biāo)函數(shù)值J;
(5)若達(dá)到最大迭代次數(shù)或前后兩次J的絕對值差小于ε,則停止計(jì)算,否則轉(zhuǎn)到第(3)步。
(6)將樣本點(diǎn)劃分為隸屬度最大的那一類。
算法流程圖如下:
圖1 算法流程圖
頭文件的定義。利用C++語言,在頭文件里針對灰度圖像和彩色圖像定義兩種類型的結(jié)構(gòu)體數(shù)據(jù),分別為GrayClusterData和ColorClusterData。在GrayClusterData定義變量size_t x,size_t y, uchar pixelVal,分別存儲(chǔ)像素點(diǎn)的x,y坐標(biāo)值和灰度值。在ColorClusterData里面定義size_t x, size_t y, uchar RGBValue[3],分別存儲(chǔ)像素點(diǎn)的x,y坐標(biāo)值和彩色圖像像素點(diǎn)的B、G、R三個(gè)值。
在頭文件里還定義一個(gè)ClusterMethod類,里面的成員變量有IplImage*mpOrgImage,IplImage*mpGrayImage,size_tmpClusterResult,double*mpCenters,分別用來存儲(chǔ)原始圖像,灰度圖像,聚類結(jié)果和聚類中心。size_t mSampleNum為樣本數(shù),size_t mClusterNum為聚類數(shù),size_t mFeatureNum為每個(gè)樣本的特征數(shù),size_t mImageWidth為原始圖像寬,size_t mImageHeight為原始圖像高,CvRNG mRNG為隨機(jī)數(shù)種子,可用cvRNG(cvGetTickCount()) 進(jìn)行初始化,GrayClusterData*mpGraySampleData用來存儲(chǔ)灰度圖像的樣本總數(shù)據(jù),ColorClusterData*mpColorSampleData用來存儲(chǔ)彩色圖像的樣本總數(shù)據(jù)。所有的成員變量都是private類型。
public成員函數(shù)有void GetClusteredImage(IplImage*pOrginalImage, IplImage*pClusteredImage, size_t clusterNum),用于傳輸原圖像pOrginalImage,獲取分割后的圖像pClusteredImage,值得注意的是,pOrginalImage和pClusteredImage都需要由外界去開辟圖像空間。
Private成員函數(shù)有void Initialize(IplImage*pOrginalImage, size_t clusterNum),用來初始化各種變量,pOrginalImage為原圖像,clusterNum為聚類數(shù)。void FuzzyCMeans(int m_value),模糊C均值算法的入口,m_value的值一般為2。void FuzzyCInitialize(double*pMemberShip, double*pDistances)為聚類的初始化,pMemberShip存儲(chǔ)總樣本隸屬度,pDistances存儲(chǔ)每一個(gè)樣本點(diǎn)到每一個(gè)聚類中心點(diǎn)的距離平方值。void FuzzyCCalculate(double*pMemberShip, double*pDistances, int m_value)用來計(jì)算模糊C均值聚類,void ClusteredResult(double*pMemberShip)用來計(jì)算聚類結(jié)果并分類,將每一個(gè)樣本點(diǎn)歸為隸屬度最大的那一類。
成員函數(shù)間的調(diào)用。GetClusteredImage函數(shù)是僅有的外部接口,main函數(shù)通過調(diào)用它,傳遞原圖像數(shù)據(jù)和獲取分割后的圖像能。該函數(shù)在內(nèi)部依次調(diào)用Initialize和FuzzyCMeans,最后將pClusteredImage中每個(gè)像素點(diǎn)的值,按照它屬于的類,依次進(jìn)行賦值,這樣整幅圖像就被分成了c個(gè)類的值了。
FuzzyCMeans函數(shù)按順序分別調(diào)用FuzzyCInitialize、FuzzyCCalculate和ClusteredResult三個(gè)函數(shù)。調(diào)用的結(jié)構(gòu)見圖2,按照1-6的順序執(zhí)行。首先在main函數(shù)中定義原圖pOrginalImage,分割后的圖像pClusteredImage,和聚類數(shù)clusterNum,然后將3個(gè)參數(shù)傳遞給GetClusteredImage,最后用pClusteredImage存儲(chǔ)分割后的圖像。
圖2 成員函數(shù)調(diào)用流程
數(shù)據(jù)的賦值。大部分?jǐn)?shù)據(jù)的賦值工作由Initialize成員函數(shù)完成,根據(jù)外部傳遞進(jìn)來的圖像數(shù)據(jù)進(jìn)行賦值。在Initialize函數(shù)中開辟mpGraySampleData和mpColorSampleData空間,存儲(chǔ)原始灰度和彩色圖像的數(shù)據(jù)。
模糊C均值聚類算法的實(shí)現(xiàn)。模糊C均值算法的實(shí)現(xiàn)由FuzzyCMeans函數(shù)完成,在該函數(shù)里,開辟了存儲(chǔ)總樣本隸屬度pMemberShip、樣本與聚類中心距離平方的集合pDistances、聚類中心點(diǎn)集合mpCenters和聚類結(jié)果集合mpClusterResult的空間。在調(diào)用完FuzzyCInitialize、FuzzyCCalculate和ClusteredResult函數(shù)后,還需要負(fù)責(zé)釋放非成員變量pMemberShip和pDistances動(dòng)態(tài)開辟的空間。
模糊C聚類算法初始化與計(jì)算。聚類算法的初始化是通過FuzzyCInitialize實(shí)現(xiàn)的,其作用是初始化聚類中心和初始化樣本與聚類中心距離平方的集合(簡稱距離矩陣)。FCM算法的計(jì)算通過FuzzyCCalculate實(shí)現(xiàn),主要是計(jì)算隸屬度和聚類中心以及相鄰兩代目標(biāo)函數(shù)值的絕對差,根據(jù)公式(3)和公式(4),分別得出每次迭代更新的聚類中心和隸屬度,并求出聚類中心更新后的樣本點(diǎn)到每個(gè)聚類中心的距離矩陣。若前后兩次的目標(biāo)函數(shù)值小于允許誤差或運(yùn)行次數(shù)超過最大迭代次數(shù),則終止計(jì)算,否則重新計(jì)算隸屬度、聚類中心和距離矩陣。
聚類結(jié)果的計(jì)算。把每個(gè)樣本所屬類的值存儲(chǔ)到mpClusterResult中。該過程是通過ClusteredResult函數(shù)實(shí)現(xiàn)的,它將每個(gè)樣本點(diǎn)的隸屬度進(jìn)行比較,將隸屬度最大的類賦給該樣本,并存儲(chǔ)到mpClusterResult中。
本文采用兩幅彩色圖進(jìn)行對比實(shí)驗(yàn),原圖為圖3所示,其中Lena像素分別率為512*512,JLK Magenta像素分辨率是586*764。實(shí)驗(yàn)電腦配置:CPUi7 7700HQ,內(nèi)存8G,win10 x64系統(tǒng),硬盤為固態(tài)硬盤128G。
對于灰度圖像,采用模糊C均值聚類算法和分水嶺算法進(jìn)行對比研究;對于彩色圖像,僅采用模糊C均值聚類算法。
4.1灰度圖像分割
首先,對圖3中的Lena用模糊C均值聚類算法進(jìn)行圖像分割,以灰度像素值為樣本特征值,設(shè)置聚類數(shù)目分別為2和5,圖像分割的結(jié)果見圖4。
Lena JLK Magenta圖3 原始圖像
對JLK Magenta進(jìn)行灰度圖像分割的結(jié)果如圖5所示。
聚類數(shù)為2 聚類數(shù)為5圖5 JLK Magenta灰度分割后的圖像
將程序各運(yùn)行10次可知,不同聚類數(shù)和分辨率的圖像分割時(shí)間不同,聚類數(shù)越多,運(yùn)行時(shí)間越長;JLK Magenta圖像分割比Lena圖像分割的運(yùn)行時(shí)間長。表1和表2分別記錄了Lena圖像分割和JLK Magenta圖像分割的運(yùn)行時(shí)間和平均運(yùn)行時(shí)間。
表1 灰度Lena不同聚類數(shù)的運(yùn)行時(shí)間(單位:秒)
表2 灰度JLK Magenta不同聚類數(shù)的運(yùn)行時(shí)間(單位:秒)
再對Lena和JLK Magenta圖像分別用分水嶺算法進(jìn)行分割,結(jié)果如圖6所示。
將圖4和圖6的Lena分析可得,圖4分割清晰準(zhǔn)確,區(qū)域劃分簡潔明朗,圖6的Lena中局部圖像區(qū)域劃分過多。圖4中,當(dāng)聚類數(shù)為2時(shí),區(qū)域劃分更為簡潔,當(dāng)聚類數(shù)為5時(shí),圖像分割更精細(xì)。
將圖5和圖6的JLK Magenta做對比可知,圖5邊緣分割精確,當(dāng)聚類數(shù)為2時(shí),整體分為兩大類,整個(gè)人體的輪廓清晰可見,但具體的細(xì)節(jié)不夠,如眼睛等;當(dāng)聚類數(shù)為5時(shí),細(xì)節(jié)信息顯露得十分清楚。而圖6的JLK Magenta區(qū)域劃分不準(zhǔn)確,局部區(qū)域分割過多,細(xì)節(jié)信息偏少。
4.2彩色圖像分割
對圖3的兩幅圖像做彩色圖像分割,以R、G、B三個(gè)空間的像素值作為樣本的特征值,設(shè)置聚類數(shù)目分別為2和5,對Lena和JLK Magenta分別進(jìn)行圖像分割,其結(jié)果見圖7和圖8。
Lena JLK Magenta 圖6 Lena分水嶺算法
分別將程序運(yùn)行10次,對于Lena的彩色和JLK Magenta的彩色圖像分割時(shí)間對比見表3和表4。
表3 彩色Lena不同聚類數(shù)的運(yùn)行時(shí)間(單位:秒)
表4 彩色JLK Magenta不同聚類數(shù)的運(yùn)行時(shí)間(單位:秒)
將表1和表3對比,表2和表4對比可以看出,同一張圖片,在相同聚類數(shù)的情況下,對灰度和彩色圖像進(jìn)行分割,運(yùn)行時(shí)間差異很大,故一個(gè)樣本的特征數(shù)目越多,運(yùn)行時(shí)間越長。將表1和表2對比,表3和表4對比可以看出,對于分辨率不一樣、其他情況相同的圖片,運(yùn)行時(shí)間也是不同的,分辨率越大的,運(yùn)行時(shí)間越長。單獨(dú)看表1、2、3、4,對于同一張圖片,聚類數(shù)不同,其他條件均相同的圖片,聚類數(shù)越多,所消耗的時(shí)間越長。上述圖像中當(dāng)聚類數(shù)為2時(shí),切割后的圖像的信息顯得丟失不少,而當(dāng)聚類數(shù)為5時(shí),運(yùn)行的時(shí)間大幅增加,故在確定聚類數(shù)的時(shí)候需要有一個(gè)權(quán)衡。將圖4與圖5對比,圖6與圖7對比,可以看出,模糊C均值聚類算法的圖像分割效果比分水嶺算法要好很多,分水嶺算法在圖像局部區(qū)域過多分割,而且圖像邊緣也沒有模糊C均值聚類算法檢測的精確。總體上看,對于無噪聲的圖片,模糊C均值算法要優(yōu)于分水嶺算法,但要達(dá)到實(shí)時(shí)圖像處理,還需要進(jìn)一步改進(jìn)算法。本文的程序運(yùn)行時(shí)間較長,需要對模糊C均值算法進(jìn)行改進(jìn)和優(yōu)化。由于模糊C均值算法對含有噪聲的圖片很敏感,所以沒有詳細(xì)討論,如何抗噪,也是需要改進(jìn)的一個(gè)方向。另外,在運(yùn)行程序前,需要人為根據(jù)實(shí)際圖片,憑經(jīng)驗(yàn)確定分類數(shù)目,無法進(jìn)行自動(dòng)確定分類數(shù),從而無法對圖像進(jìn)行自動(dòng)分割。如何進(jìn)行自動(dòng)確定圖像分類數(shù)也是以后需要改進(jìn)的一個(gè)方向。
[1] Zaitoun N M, Aqel M J. Survey on Image Segmentation Techniques[J].Procedia Computer Science, 2015, 65(4):797-806.
[2] Zhang M, Jiao L, Ma W, et al. Multi-objective evolutionary fuzzy clustering for image segmentation with MOEA/D[J].Applied Soft Computing, 2016(48): 621-637.
[3] Qian P, Zhao K, Jiang Y, et al. Knowledge-leveraged transfer fuzzy C-Means for texture image segmentation with self-adaptive cluster prototype matching[J].Knowledge-Based Systems, 2017(130): 33-50.
[4] 江銘炎,袁東風(fēng).人工蜂群算法及其應(yīng)用[M].北京: 科學(xué)出版社,2014:195-197.
(責(zé)任編輯:熊文濤)
TP391.41
A
2095-4824(2017)06-0091-06
2017-09-05
劉 衣(1986- ),男,湖北孝感人,湖北工程學(xué)院新技術(shù)學(xué)院助教,碩士。
游繼安(1987- ),男,湖北孝感人,湖北工程學(xué)院新技術(shù)學(xué)院助教,碩士。