最近在研究模糊聚类在图像处理中的应用,其中需要验证一种基于直觉模糊集的直觉模糊C均值聚类(IFCM)算法。直觉模糊决策是一种模糊信息的概念,把只考虑隶属度的经典模糊C均值聚类(FCM)推广为同时考虑真隶属度、假隶属度和犹豫度这三方面信息的直觉模糊集,同时引入一个新的参数即直觉模糊熵。相比经典模糊C均值聚类,使用直觉模糊集定义的模糊聚类可以收敛到一个更理想的聚类中心。模糊聚类广泛应用在控制、模式识别、信号处理、人工智能、决策等领域。本文使用FCM和IFCM算法进行图像分割,用于区分脑CT图像中的不同区域并识别大脑中的异常。
在日常生活中,有许多事物或多或少都具有模糊性,模糊虽难以捉摸,但却非常重要。模糊理论强调以模糊逻辑来描述现实生活中的事物,以弥补二值逻辑无法对不明确定义边界事物描述的缺点。人类的自然语言在表达上具有很大的模糊性,难以用二值逻辑来完全描述现实生活中的事物。故模糊理论将模糊概念以模糊集合的定义,将事件属于某集合程度的隶属函数加以模糊量化,得到隶属度,来处理问题。
模糊聚类就是用模糊数学的方法,把样本之间的模糊关系定量,从而客观准确地进行聚类,使得各个类之间的数据差别应尽可能大,类内之间的数据差别应尽可能小,即最小化类间的相似性,最大化类内的相似性。而模糊C均值就是一种应用最广泛且较成功的模糊聚类方法。它通过优化目标函数得到每个样本点对所有类中心的隶属度,从而决定样本点的类属以达到对样本进行分类的目的。
2.模糊理论的应用
1965年,Zadeh教授提出了著名的模糊集理论,创建了一个新的学科——模糊数学,主要包括模糊集合理论、模糊逻辑、模糊推理和模糊控制等方面的内容。其中模糊集合理论是对传统集合理论的一种推广,能较好的描述人类视觉中的模糊性,在模式识别的各个层次都可使用模糊集合理论。模糊理论主要解决在模式识别的不同层次出于信息不全面、不准确、含糊、矛盾等造成的不确定性问题。
2.1 模糊聚类理论
基于模糊集合的特点,模糊聚类方法应运而生。聚类,就是将一组给定的未知类标号的样本分成内在的多个类别,使得同一类中的样本具有较高的相似度,而不同的类中样本差别大。聚类分析的目的是揭示和刻画数据的内在结构,其内容涉及统计学、生物学、以及机器学习等研究领域,并在模式识别、数据分析和挖掘、图像处理等领域获得了广泛的应用。
1973年,J.C. Bezdek提出了里程碑式的模糊C均值聚类算法(FCM)[1],通过引入样本到聚类中心的隶属度,使准则函数不仅可微,且软化了模式的归属。
在众多模糊聚类算法中,FCM算法应用最广泛且较成功,它通过优化目标函数得到每个样本点对所有类中心的隶属度,从而决定样本点的类属以达到自动对样本数据进行分类的目的。
根据聚类的数目C和一组包含n个L维向量的数据xk,用FCM算法输出元素的隶属度uij,它代表着数据xj是属于第i个类的概率,可以通过求下面式子(1)目标函数的最小值得到,通常取m=2。
其中,式(1)的约束条件为:
在(1)式的约束条件下,可以求得(1)中目标函数取最小值时相应的隶属度矩阵和聚类中心。通常,该最小值用极小值代替,因此分别对各变量求偏导,并令偏导数为0,联立并解出更新后的模糊隶属度和聚类中心,如下公式(2)(3)。
根据FCM的基本原理,总结出该算法的步骤如下:
1) 设置目标函数的精度e,模糊指数m(m通常取2)和算法最大迭代次数;
2) 初始化隶属度矩阵或聚类中心;
3) 由式(2)(3)更新模糊划分矩阵和聚类中心;
5) 根据所得到的隶属度矩阵,取样本隶属度最大值所对应类作为样本聚类的结果,聚类结束。
图1给出FCM的算法流程图。
FCM算法优越于传统硬C均值聚类算法在于隶属度可以连续取值于 [0,1]区间,考虑到了样本属于各个类的“亦此亦彼”性,能够对类与类之间样本有重叠的数据集进行分类,具有良好的收敛性;而且FCM算法复杂度低,易于实现。然而,FCM也存在着不足之处,如目标函数在迭代过程中容易陷入局部最小、函数收敛速度慢、对初始值、噪声比较敏感等问题。下面从分析模糊C均值聚类划分矩阵的隶属度的含义、划分趋势出发,讨论一种可以改善FCM性能的算法——IFCM算法。在此之前需要引入新的概念,即直觉模糊集。
直觉模糊集(IFS)作为模糊集的重要拓展,通过增加新的属性参数——非隶属度γ和不确定度π,从而更加细腻地刻画客观世界的模糊性质,假设直觉模糊集A表示了样本x与论域X={x1,x2,…,xn }的关系,有:
有关IFS的研究目前已成为热点,其中模糊聚类分析是其重要研究领域。对于传统的模糊算法,非隶属度只是作为隶属度的补而存在,但是在IFS中,同时考虑了隶属度、非隶属度和不确定度的作用,使得非隶属度的定义和一般的模糊算法不同。直觉模糊C均值聚类算法引入了不确定度这个概念。这是因为在聚类过程中,分类方式取决于人的选择,所以分类方式带来的隶属度是不确定的,在缺乏明确定义的分类方式的时候会有不确定的因素。
聚类中引入了一个新的概念:直觉模糊熵(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之间时效果较好。
将直觉模糊隶属度运用到FCM算法中,就形成了IFCM算法。下面给出IFCM算法的计算过程:
首先更新隶属度公式:,它是第j个数据点对第i个聚类中心的直觉模糊隶属度。由上述公式可得到新的聚类中心公式:
当聚类中心更新时,隶属度矩阵也将被更新。在每次迭代过程中,聚类中心和隶属度矩阵的数值都会更新一次,直到前一次隶属度矩阵和再次更新的隶属度矩阵的差值小于一定阈值时可结束迭代,此时聚类中心达到最优。一般的,隶属度差值定义为:
另一种判断算法迭代效果的方法是计算目标函数是否达到最小值。在FCM算法中目标函数为:
而在IFCM算法中,为了使聚类中有效数据点最大化,使数据矩阵的熵最小化,引入了第二个公式。当每个聚类中的元素的不确定度都已知时,就能计算出对应的直觉模糊熵。直觉模糊熵表达了聚类中的模糊程度。目标函数的第二个公式定义为:
综上所述,IFCM的算法步骤可以归纳如下:
1) 第一步同FCM。首先定义一个准则函数,选择C个初始聚类中心或初始化一个随机的隶属度矩阵(迭代初始条件)。
2) 引入不确定度参数,将隶属度矩阵变为模糊隶属度矩阵。
3) 使用模糊隶属度矩阵计算样本到聚类中心的距离,将样本划分到各个类中。
4) 重新计算每个类的聚类中心、样本到聚类中心的距离。每次计算都使用直觉模糊隶属度矩阵代替原有的隶属度矩阵,并将样本重新划分到各个类中。
5) 重复2,3,4步,直到准则函数最小或达到指定阈值。
6) 对于图像分割,将迭代后的聚类中心映射到各种图像信息,如灰度值,从而实现图像各像素点的灰度值分类。
图像分割就是把图像细分为构成它的对象或子区域,这些区域是互不相交的,每个区域都满足特定区域的一致性。分割的程度主要取决于人们想要解决的问题,当感兴趣的区域或对象已经被区分出来,分割就算完成。图像分割是图像处理中的重要问题,也是计算机视觉研究中的一个经典难题。计算机视觉中的图像理解包括目标检测、特征提取和目标识别等,都依赖于分割的质量。
目前,图像分割算法一般是围绕亮度值的两个基本特性设计的:不连续性和相似性。亮度值的不连续性的应用途径主要是基于像素点特性(如灰度值)的不连续变化分割图像,如最常用的边缘检测。而利用亮度值的相似性可以形成一套机制,即依据事先指定的准则将图像分割为相似的区域。一些实例包括门限处理、区域分离、区域生长和聚类等。而采用模糊C均值聚类及其扩展算法进行图像分割的好处是避免了阈值的设定问题,聚类的过程不需要人工干预,只需输入预想的分类数目即可实现自动化的图像分割。
在图像分割中,模糊隶属度可用于表示一幅灰度图像中一像素点属于一个灰度值中心的程度,因此只需要寻找像素点对某灰度值中心的最大隶属度,即可将该像素点划分到该灰度级的区域中去。对于灰度图像分割,模糊隶属度的计算公式可写成:
图像分割的效果主要取决于各中心灰度值gray的选取。根据公式(5)及IFCM算法的基本公式,得到中心灰度值的计算公式:
其中xj为各像素点的灰度值。
对于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算法的分割结果
图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