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