最近在研究模糊聚類在圖像進行中的應用,其中需要驗證一種基于直覺模糊集的直覺模糊C均值聚類(IFCM)算法。直覺模糊決策是一種模糊資訊的概念,把隻考慮隸屬度的經典模糊C均值聚類(FCM)推廣為同時考慮真隸屬度、假隸屬度和猶豫度這三方面資訊的直覺模糊集,同時引入一個新的參數即直覺模糊熵。相比經典模糊C均值聚類,使用直覺模糊集定義的模糊聚類可以收斂到一個更理想的聚類中心。模糊聚類廣泛應用在控制、模式識别、信号處理、人工智能、決策等領域。本文使用FCM和IFCM算法進行圖像分割,用于區分腦CT圖像中的不同區域并識别大腦中的異常。
1.模糊理論的介紹
在日常生活中,有許多事物或多或少都具有模糊性,模糊雖難以捉摸,但卻非常重要。模糊理論強調以模糊邏輯來描述現實生活中的事物,以彌補二值邏輯無法對不明确定義邊界事物描述的缺點。人類的自然語言在表達上具有很大的模糊性,難以用二值邏輯來完全描述現實生活中的事物。故模糊理論将模糊概念以模糊集合的定義,将事件屬于某集合程度的隸屬函數加以模糊量化,得到隸屬度,來處理問題。
模糊聚類就是用模糊數學的方法,把樣本之間的模糊關系定量,進而客觀準确地進行聚類,使得各個類之間的資料差别應盡可能大,類内之間的資料差别應盡可能小,即最小化類間的相似性,最大化類内的相似性。而模糊C均值就是一種應用最廣泛且較成功的模糊聚類方法。它通過優化目标函數得到每個樣本點對所有類中心的隸屬度,進而決定樣本點的類屬以達到對樣本進行分類的目的。
2.模糊理論的應用
1965年,Zadeh教授提出了著名的模糊集理論,建立了一個新的學科——模糊數學,主要包括模糊集合理論、模糊邏輯、模糊推理和模糊控制等方面的内容。其中模糊集合理論是對傳統集合理論的一種推廣,能較好的描述人類視覺中的模糊性,在模式識别的各個層次都可使用模糊集合理論。模糊理論主要解決在模式識别的不同層次出于資訊不全面、不準确、含糊、沖突等造成的不确定性問題。
2.1 模糊聚類理論
基于模糊集合的特點,模糊聚類方法應運而生。聚類,就是将一組給定的未知類标号的樣本分成内在的多個類别,使得同一類中的樣本具有較高的相似度,而不同的類中樣本差别大。聚類分析的目的是揭示和刻畫資料的内在結構,其内容涉及統計學、生物學、以及機器學習等研究領域,并在模式識别、資料分析和挖掘、圖像處理等領域獲得了廣泛的應用。
1973年,J.C. Bezdek提出了裡程碑式的模糊C均值聚類算法(FCM)[1],通過引入樣本到聚類中心的隸屬度,使準則函數不僅可微,且軟化了模式的歸屬。
在衆多模糊聚類算法中,FCM算法應用最廣泛且較成功,它通過優化目标函數得到每個樣本點對所有類中心的隸屬度,進而決定樣本點的類屬以達到自動對樣本資料進行分類的目的。
2.1.1 FCM算法原理
根據聚類的數目C和一組包含n個L維向量的資料xk,用FCM算法輸出元素的隸屬度uij,它代表着資料xj是屬于第i個類的機率,可以通過求下面式子(1)目标函數的最小值得到,通常取m=2。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICN0AjNxYzMxEDNxIDM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
其中,式(1)的限制條件為:
在(1)式的限制條件下,可以求得(1)中目标函數取最小值時相應的隸屬度矩陣和聚類中心。通常,該最小值用極小值代替,是以分别對各變量求偏導,并令偏導數為0,聯立并解出更新後的模糊隸屬度和聚類中心,如下公式(2)(3)。
2.1.2 FCM算法流程
根據FCM的基本原理,總結出該算法的步驟如下:
1) 設定目标函數的精度e,模糊指數m(m通常取2)和算法最大疊代次數;
2) 初始化隸屬度矩陣
或聚類中心
;
3) 由式(2)(3)更新模糊劃分矩陣
和聚類中心
;
4) 若目标函數
則疊代結束;否則,跳轉執行第三步;
5) 根據所得到的隸屬度矩陣,取樣本隸屬度最大值所對應類作為樣本聚類的結果,聚類結束。
圖1給出FCM的算法流程圖。
2.1.3 FCM算法的優劣
FCM算法優越于傳統硬C均值聚類算法在于隸屬度可以連續取值于 [0,1]區間,考慮到了樣本屬于各個類的“亦此亦彼”性,能夠對類與類之間樣本有重疊的資料集進行分類,具有良好的收斂性;而且FCM算法複雜度低,易于實作。然而,FCM也存在着不足之處,如目标函數在疊代過程中容易陷入局部最小、函數收斂速度慢、對初始值、噪聲比較敏感等問題。下面從分析模糊C均值聚類劃分矩陣的隸屬度的含義、劃分趨勢出發,讨論一種可以改善FCM性能的算法——IFCM算法。在此之前需要引入新的概念,即直覺模糊集。
2.2 直覺模糊聚類理論
2.2.1 直覺模糊集簡介
直覺模糊集(IFS)作為模糊集的重要拓展,通過增加新的屬性參數——非隸屬度γ和不确定度π,進而更加細膩地刻畫客觀世界的模糊性質,假設直覺模糊集A表示了樣本x與論域X={x1,x2,…,xn }的關系,有:
特别的,當時
,直覺模糊集A變為普通的模糊集合。
有關IFS的研究目前已成為熱點,其中模糊聚類分析是其重要研究領域。對于傳統的模糊算法,非隸屬度隻是作為隸屬度的補而存在,但是在IFS中,同時考慮了隸屬度、非隸屬度和不确定度的作用,使得非隸屬度的定義和一般的模糊算法不同。直覺模糊C均值聚類算法引入了不确定度這個概念。這是因為在聚類過程中,分類方式取決于人的選擇,是以分類方式帶來的隸屬度是不确定的,在缺乏明确定義的分類方式的時候會有不确定的因素。
2.2.2 直覺模糊熵
聚類中引入了一個新的概念:直覺模糊熵(IFE)。本來這個概念是用來度量模糊集的模糊度的,Zadeh在1969年第一次使用了這個概念[2]。後來Kaufmann用測得的距離來重新定義了這個概念[3]。Yager把它定義為到一個聚類的距離以及它的補[4]。Szmidt和Kacpryzk從非機率的角度定義了熵[5]。一般認為,直覺模糊熵給出了一個模糊集的模糊程度。
如果一個實函數IFE(x)叫做X的直覺模糊熵,那麼它滿足以下幾個條件:
若A是普通模糊集,那麼IFE(A)=0;
若:
,則IFE(A)=n;
若每個元素的隸屬度和非隸屬度都減少,那麼它們的和也減少,模糊度減少,不确定度增加,IFE增加。即:
在直覺模糊集中,
分别是論域
的隸屬度,非隸屬度和不确定度,那麼直覺模糊熵IFE可以表示該模糊集的直覺度。它可以定義成:
可以看出,定義的IFE滿足上述的三個屬性,則根據Yager直覺模互補公式[6],非隸屬度公式可寫為:
到不确定度公式可得:
模糊集A可表示為:
公式中α的取值需要做進一步的讨論,實驗結果表明當α取值在0.8~0.9之間時效果較好。
2.2.3 IFCM算法介紹
将直覺模糊隸屬度運用到FCM算法中,就形成了IFCM算法。下面給出IFCM算法的計算過程:
首先更新隸屬度公式:
,它是第j個資料點對第i個聚類中心的直覺模糊隸屬度。由上述公式可得到新的聚類中心公式:
當聚類中心更新時,隸屬度矩陣也将被更新。在每次疊代過程中,聚類中心和隸屬度矩陣的數值都會更新一次,直到前一次隸屬度矩陣和再次更新的隸屬度矩陣的內插補點小于一定門檻值時可結束疊代,此時聚類中心達到最優。一般的,隸屬度內插補點定義為:
另一種判斷算法疊代效果的方法是計算目标函數是否達到最小值。在FCM算法中目标函數為:
而在IFCM算法中,為了使聚類中有效資料點最大化,使資料矩陣的熵最小化,引入了第二個公式。當每個聚類中的元素的不确定度都已知時,就能計算出對應的直覺模糊熵。直覺模糊熵表達了聚類中的模糊程度。目标函數的第二個公式定義為:
綜上所述,IFCM的算法步驟可以歸納如下:
1) 第一步同FCM。首先定義一個準則函數,選擇C個初始聚類中心或初始化一個随機的隸屬度矩陣(疊代初始條件)。
2) 引入不确定度參數,将隸屬度矩陣變為模糊隸屬度矩陣。
3) 使用模糊隸屬度矩陣計算樣本到聚類中心的距離,将樣本劃分到各個類中。
4) 重新計算每個類的聚類中心、樣本到聚類中心的距離。每次計算都使用直覺模糊隸屬度矩陣代替原有的隸屬度矩陣,并将樣本重新劃分到各個類中。
5) 重複2,3,4步,直到準則函數最小或達到指定門檻值。
6) 對于圖像分割,将疊代後的聚類中心映射到各種圖像資訊,如灰階值,進而實作圖像各像素點的灰階值分類。
3.基于模糊聚類的圖像分割
3.1 圖像分割概述
圖像分割就是把圖像細分為構成它的對象或子區域,這些區域是互不相交的,每個區域都滿足特定區域的一緻性。分割的程度主要取決于人們想要解決的問題,當感興趣的區域或對象已經被區分出來,分割就算完成。圖像分割是圖像進行中的重要問題,也是計算機視覺研究中的一個經典難題。計算機視覺中的圖像了解包括目标檢測、特征提取和目辨別别等,都依賴于分割的品質。
目前,圖像分割算法一般是圍繞亮度值的兩個基本特性設計的:不連續性和相似性。亮度值的不連續性的應用途徑主要是基于像素點特性(如灰階值)的不連續變化分割圖像,如最常用的邊緣檢測。而利用亮度值的相似性可以形成一套機制,即依據事先指定的準則将圖像分割為相似的區域。一些執行個體包括門限處理、區域分離、區域生長和聚類等。而采用模糊C均值聚類及其擴充算法進行圖像分割的好處是避免了門檻值的設定問題,聚類的過程不需要人工幹預,隻需輸入預想的分類數目即可實作自動化的圖像分割。
3.2 模糊隸屬度矩陣在圖像分割的意義
在圖像分割中,模糊隸屬度
可用于表示一幅灰階圖像中一像素點
屬于一個灰階值中心
的程度,是以隻需要尋找像素點對某灰階值中心的最大隸屬度,即可将該像素點劃分到該灰階級的區域中去。對于灰階圖像分割,模糊隸屬度的計算公式可寫成:
3.3 模糊聚類中心在圖像分割中的作用
圖像分割的效果主要取決于各中心灰階值gray的選取。根據公式(5)及IFCM算法的基本公式,得到中心灰階值的計算公式:
其中xj為各像素點的灰階值。
4.結果與讨論
4.1 參數α的影響
對于IFCM算法中不确定度的參數α的取值,圖2,3,4分别給出α=0.5,α=0.7和α=0.85時的分割效果。當取α=0.5或更小時,灰階圖像無法得到适當的分割效果;當α=0.7時可以輸出分割圖像,而若α取0.8或更高時,分割的效果更好。本實驗標明α=0.85作為經驗值。
圖2 時IFCM算法的分割結果
圖3 α=0.7時IFCM算法的分割結果
圖4 α=0.85時IFCM算法的分割結果
4.2 FCM與IFCM聚類效果對比
圖5使用的素材是一張亮度不足的腦部CT圖像,它顯示了側腦室、第三腦室和左下角部位的血凝(出血性中風)。使用FCM和IFCM算法将該圖像分割為四個灰階級别。可以清楚看到,FCM和IFCM聚類均能清晰檢測出血塊區域并對其餘區域進行有效劃分,但基于FCM算法的分割結果包含了更多的噪聲成分,而IFCM算法能對某些區域的噪聲進行有效抑制,且對于需要重點關注的血凝塊區域,IFCM的劃分結果比FCM要更加明顯。總體上看,IFCM算法在不丢失細節的前提下改善了圖像分割中噪聲問題。
圖5 (a)腦部淤血CT圖像1,(b)FCM聚類結果,(c)IFCM聚類結果
圖6使用了一張較為清晰的腦部CT圖像,它同樣顯示了一團灰白色的腦部出血,該圖像添加了加性噪聲。驗證FCM和IFCM算法産生的分割圖像的效果,把圖像的灰階級分為四類。不難發現,前者生成的分割圖像中的細節部分受噪聲污染嚴重,且血塊部分的大小小于原圖、劃分後的白色血塊區域有空洞。而後者生成的效果圖顯然更清晰地突出了血塊區域。從整體分割效果來看,IFCM算法消除了大部分的噪聲,使各區域的區分更加明顯。
圖6 (a)腦部淤血CT圖像2,(b)FCM聚類結果,(c)IFCM聚類結果
總結:IFCM算法是FCM算法的推廣,它繼承了FCM的主要優點:算法設計簡單,可轉化為優化問題、算法複雜度低。而FCM算法的一些缺點在IFCM算法中同樣存在,如在計算目标函數時易陷入局部最小、聚類數目需要事先确定等等。
直覺模糊C均值聚類(IFCM)算法在FCM的基礎上引入關鍵的不确定度 ,使得圖像分割在圖像噪聲的濾除和圖像的細節保留之間取得平衡。是以該算法理論上能改善圖像分割中的噪聲問題,但現實中對于不同圖像的分割效果各異。而對于無嚴重噪聲污染的圖像,IFCM與FCM的處理效果并沒有太大的差別。
不确定度中參數取的是經驗值,是以參數的選取是否是最優值有待進一步的驗證。
總體上,IFCM算法的性能要優于FCM算法。
參考文獻:
[1] J.C. Bezdek, L.O. Hall, L.P. Clark, Review of MRsegmentation technique in pattern recognition[J], Medical Physics 10 (20) (1993) 33–48.
[2] L.A. Zadeh, Fuzzy sets and systems, in: Proc of Symposium on systems theory[J], Polytechnic Institute of Brooklyn, NY, USA, 1965.
[3] A. Kaufmann, Introduction to the Theory of Fuzzy Subsets: Fundamental Theoretical Elements-1[J], Academic Press, New York, 1980.
[4] R.R. Yager, On the measures of fuzziness and negation part II lattices[J], Information and Control 44 (1980) 236–260.
[5] E. Szmidt, J. Kacpryzk, Entropy of an intuitionistic fuzzy set[J], Fuzzy Sets and Systems 118 (2001) 467–477.
[6] P. Burillo, H. Bustince, Entropy on intuitionistic fuzzy set and on interval-valued fuzzy set[J], Fuzzy Sets and Systems 78 (1996) 305–316.
Matlab中已經自帶FCM的相關函數,是以也可直接調用。以下給出的是參考了一些自編代碼後寫的Matlab代碼,而在OpenCV中的效果需要進一步完善。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 主函數
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function main
ima = imread('MR6.jpg');
% 先設定FCM的幾個初始參數
options=[2; % FCM公式中的參數m
100; % 最大疊代次數
1e-5]; % 目标函數的最小誤差
class_number = 4; % 分為4類
imt = ImageSegmentation(ima,class_number,options)
subplot(1,2,1),imshow(ima),title('原圖');
subplot(1,2,2),imshow(imt); %顯示生成的分割的圖像
kk = strcat('分割成',int2str(class_number),'類的輸出圖像');
title(kk);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ImageSegmentation()函數:實作聚類分割圖像
% 輸入:file為灰階圖像檔案 cluster_n為聚類類别個數 options為預設的初始參數
% 輸出分割後的圖像
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function imt = ImageSegmentation(file, cluster_n, options)
ima = file;
I = im2double(file);
[x,y] = size(ima);
number = x * y; % 圖像的元素個數numel(I)
data = reshape(I,number,1); %将矩陣元素轉換為一列資料
[center, U] = FCMprocess(data,cluster_n,options); %調用FCMData函數進行聚類
% 對于每個元素對不同聚類中心的隸屬度,找出最大的那個隸屬度
maxU = max(U); % 找出每一列的最大隸屬度
temp = sort(center);
for i = 1:cluster_n; % 按聚類結果分割圖像
% 前面求出每個元素的最大隸屬度,屬于各聚類中心的元素坐标,并存放這些坐标
% 調用eval函數将括号裡的字元串轉化為指令執行
eval(['class_',int2str(i), '= find(U(', int2str(i), ',:) == maxU);']);
%gray = round(255 * (i-1) / (cluster_n-1));
index = find(temp == center(i));
switch index
case 1
gray = 0;
case cluster_n
gray = 255;
otherwise
gray = fix(255*(index-1)/(cluster_n-1));
end
eval(['I(class_',int2str(i), '(:))=', int2str(gray),';']);
end;
imt = mat2gray(I);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 用于計算聚類中心、隸屬度矩陣和目标函數
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [center, U] = FCMprocess(data, cluster_num, options)
%data為聚類資料,cluster_num為類别數
m = options(1); % 參數m
max_iteration = options(2); % 最終的疊代次數
min_deviation = options(3); % 最小判别誤差
data_number = size(data, 1); % 元素個數
obj_function = zeros(max_iteration, 1); % obj_function用于存放目标函數的值
% 生成隸屬度矩陣U
U = rand(cluster_num, data_number); % 随機生成隸屬度矩陣U
sumU = sum(U,1); % 計算U中每列元素和
for k = 1:data_number
U(:,k) = U(:,k) ./ sumU(k); % 對隸屬矩陣U進行歸一化處理
end
for i = 1:max_iteration
[U, center, obj_function(i)] = FCMStep(data, U, cluster_num, m); %調用FCMStep函數進行疊代
fprintf('第%d次疊代, 目标函數值為%f\n', i, obj_function(i));
% 檢查疊代終止條件
if i > 1,
if abs(obj_function(i) - obj_function(i-1)) < min_deviation
break;
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 該函數用于每次疊代過程
function [newU,center,obj_function] = FCMStep(data, U, cluster_num, m)
% data為被聚類資料,U為隸屬度矩陣,cluster_num為聚類類别數,m為FCM中的參數m
% 函數調用後得到新的隸屬度矩陣newU,聚類中心center,目标函數值obj_function
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 以下是計算模糊隸屬度Ut
[x,y] = size(U);
A = ones(x,y);
a = 0.85;
Ut = abs(A - U -(A - (U).^a).^(1/a));
Ud = U + Ut;
[j,k,l] = size(data);
pp = y;
pai = (sum(Ut,2)) ./pp;
obj = sum(pai.*exp(1-pai));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ud = U;
% obj = 0;
nf = Ud;
mf = Ud.^m; % FMC中的U^m
% center = nf*data./((ones(size(data, 2), 1)*sum(nf'))'); % 得到聚類中心
data1 = zeros(x,y);
data1(1,:) = data';
data1(2,:) = data';
data1(3,:) = data';
data1(4,:) = data';
% data1(5,:) = data';
center = sum(nf.*data1,2)./sum(nf,2); % 得到聚類中心
dist = Distance(center, data); % 調用myfcmdist函數計算聚類中心與被聚類資料的距離
obj_function = sum(sum((dist.^2).*mf))+obj; % 得到目标函數值
tmp = dist.^(-2/(m-1)); % 如果疊代次數不為1,計算新的隸屬度矩陣
newU = tmp./(ones(cluster_num, 1)*sum(tmp)); % U_new為新的隸屬度矩陣
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Distance()函數用于計算聚類中心與被聚類資料的距離
% center為聚類中心,data為被聚類資料,輸出各元素到聚類中心的距離out
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function out = Distance(center, data)
data_number = size(data,1);
class_number = size(center, 1);
kk = ones(data_number,1); % 構造與資料大小相同的全1矩陣kk
out = zeros(class_number, data_number);
if size(center, 2) > 1, %若類别數大于1
for k = 1:class_number
out(k, :) = sqrt(sum(((data - kk...
*center(k,:)).^2)'));
end
else % data為一維資料
for k = 1:class_number
out(k, :) = abs(center(k) - data)';
end
end