基于FCM算法优化的图像分割研究(附源代码)
摘要: 图像分割是指把图像分解成各具特性的区域并提取出有用目标的技术, 它是由图像处理到图像分析的一个关键步骤, 已在诸如计算机视觉、图像编码、模式识别和医学图像分析等很多领域有着实际的应用。根据图像自身存在许多不确定性和不精确性,近年来一些学者将模糊聚类应用于图像分割中, 效果要好于传统的图像分割方法。本文首先介绍了硬均值算法HCM和模糊均值FCM算法, 接着介绍了对模糊均值聚类算法的不足之处进行了改进的FCM_S、FCM_S1、FCM_S2和EnFCM算法,以及FLICM算法,以及他们的实现。针对经典算法的缺点, 在两个方面进行了改进,引入模糊因子,结合局部空间信息和灰度级信息论文把改进的算法应用于图像分割。本文对基于划分的聚类算法的图像分割进行了探讨, 然后局部模糊聚类的角度出发, 得到一种图像分割算法。实验表明这种新的算法具有良好的图像分割效果。
关键词:模糊聚类,图像分割,FCM 灰度级,FCM_S,FCM_S1, FCM_S2,直接邻域,EnFCM,FLICM,空间信息
目录
一、理论依据与相关模型
1.1 经典FCM (Fuzzy C-Means Algorithm):
1.2 约束模糊聚类FCM_S(Fuzzy Clustering With Constraints):
1.3 约束模糊聚类的变体算法FCM_S1/ FCM_S2:
1.4 加强模糊聚类EnFCM (Enhanced Fuzzy C-Means Clustering):
1.5 模糊局部信息聚类FLICM(Fuzzy Local Information C-Means Clustering Algorithm):
1.6 FCM系列算法综述与对比
二、实验结果总结
2.1 主观评价(效果图对比)
2.2 客观评价(经典评价指数)
原文下载地址
一、理论依据与相关模型
1.1 经典FCM (Fuzzy C-Means Algorithm):
首次提出模糊C -均值(FCM)聚类算法的是Dunn,后来由Bezdek引申。这是一个迭代算法,仅仅利用了像素点的灰度值信息。
function IMMM=fcm(IM)
%IM是输入的源图像
%IX2是分类结果
%IM=imread('008.png');
%subplot(2,2,1),imshow(uint8(IM)),title('原始图像');IM=IM(:,:,1);
%subplot(2,2,2),imshow(uint8(IM)),title('灰度图像');
[maxX,maxY]=size(IM);%图像大小
%IM=imnoise(IM,'gaussian',0,0.002);
IM=double(IM);IMM=cat(3,IM,IM,IM);
%初始化聚类中心(3类)
cc1=8;
cc2=100;
cc3=200;
ttFcm=0;%聚类次数,最多15次
while(ttFcm<15)ttFcm=ttFcm+1;c1=repmat(cc1,maxX,maxY);c2=repmat(cc2,maxX,maxY);c3=repmat(cc3,maxX,maxY);c=cat(3,c1,c2,c3);ree=repmat(0.000001,maxX,maxY);ree1=cat(3,ree,ree,ree);distance=IMM-c;distance=distance.*distance+ree1;daoshu=1./distance;daoshu2=daoshu(:,:,1)+daoshu(:,:,2)+daoshu(:,:,3);%计算隶属度udistance1=distance(:,:,1).*daoshu2;u1=1./distance1;distance2=distance(:,:,2).*daoshu2;u2=1./distance2;distance3=distance(:,:,3).*daoshu2;u3=1./distance3;%计算聚类中心zccc1=sum(sum(u1.*u1.*IM))/sum(sum(u1.*u1));ccc2=sum(sum(u2.*u2.*IM))/sum(sum(u2.*u2));ccc3=sum(sum(u3.*u3.*IM))/sum(sum(u3.*u3));tmpMatrix=[abs(cc1-ccc1)/cc1,abs(cc2-ccc2)/cc2,abs(cc3-ccc3)/cc3];pp=cat(3,u1,u2,u3);for i=1:maxX;for j=1:maxY;if max(pp(i,j,:))==u1(i,j)IX(i,j)=1;elseif max(pp(i,j,:))==u2(i,j)IX2(i,j)=2;elseIX2(i,j)=3;endendend%判结束条件if max(tmpMatrix)<0.0001break;elsecc1=ccc1;cc2=ccc2;cc3=ccc3;endfor i=1:maxX;for j=1:maxY;if IX2(i,j)==3IMMM(i,j)=240;elseif IX2(i,j)==2IMMM(i,j)=20;elseIMMM(i,j)=20;endendendendfor i=1:maxX;for j=1:maxY;if IX2(i,j)==3IMMM(i,j)=240;elseif IX2(i,j)==2IMMM(i,j)=20;elseIMMM(i,j)=20;endendend%显示最终分类结果
IMMM=uint8(IMMM);
%subplot(3,3,4),imshow(IMMM),
title('FCM聚类结果');
%end
1.2 约束模糊聚类FCM_S(Fuzzy Clustering With Constraints):
function IMMM=fcm_s(IM)
%IM是输入的源图像
%IX2是分类结果
%IM=imread('012.bmp');%subplot(2,2,1),imshow(uint8(IM)),title('原始图像');IM=IM(:,:,1);
%subplot(2,2,1),imshow(uint8(IM)),title('灰度图像');
[maxX,maxY]=size(IM);%图像大小
%IM = imnoise(IM,'salt & pepper',0.02);
%IM=imnoise(IM,'gaussian',0,0.002);
IM=double(IM);IMM=cat(3,IM,IM,IM);
%初始化聚类中心(3类)
cc1=20;
cc2=130;
cc3=240;
ttFcm=0;%聚类次数,最多15次
while(ttFcm<15)ttFcm=ttFcm+1;c1=cc1*ones(maxX,maxY);c2=cc2*ones(maxX,maxY);c3=cc3*ones(maxX,maxY);c=cat(3,c1,c2,c3);a=[1,1,1;1,0,1;1,1,1];%计算隶属度u distance=IMM-c;distance=distance.*distance ;%3维矩阵distance1=distance(:,:,1)+0.125*filter2(a,distance(:,:,1));distance2=distance(:,:,2)+0.125*filter2(a,distance(:,:,2));distance3=distance(:,:,3)+0.125*filter2(a,distance(:,:,3));u1=distance1./(distance1+distance2+distance3);u2=distance2./(distance1+distance2+distance3);u3=distance3./(distance1+distance2+distance3);%计算聚类中心zIM=0.225*filter2(a,IM)+IM;%IM=256/max(max(IM))*IM;%subplot(2,2,3),imshow(uint8(IM)),title('变换图像');ccc1=sum(sum(u1.*u1.*IM))/(2.8*sum(sum(u1.*u1)));ccc2=sum(sum(u2.*u2.*IM))/(2.8*sum(sum(u2.*u2)));ccc3=sum(sum(u3.*u3.*IM))/(2.8*sum(sum(u3.*u3)));tmpMatrix=[abs(cc1-ccc1)/cc1,abs(cc2-ccc2)/cc2,abs(cc3-ccc3)/cc3];pp=cat(3,u1,u2,u3);for i=1:maxX;for j=1:maxY;if max(pp(i,j,:))==u1(i,j)IX2(i,j)=1;elseif max(pp(i,j,:))==u2(i,j)IX2(i,j)=2;elseIX2(i,j)=3;endendend%判结束条件if max(tmpMatrix)<0.00001break;elsecc1=ccc1;cc2=ccc2;cc3=ccc3;endfor i=1:maxX;for j=1:maxY;if IX2(i,j)==3IMMM(i,j)=0;elseif IX2(i,j)==2IMMM(i,j)=0;elseIMMM(i,j)=255;endendendendfor i=1:maxX;for j=1:maxY;if IX2(i,j)==3IMMM(i,j)=0;elseif IX2(i,j)==2IMMM(i,j)=0;elseIMMM(i,j)=255;endendend
%显示最终分类结果
IMMM=uint8(IMMM);
%subplot(1,3,1),imshow(IMMM),
title('FCM_S聚类结果');
%end
1.3 约束模糊聚类的变体算法FCM_S1/ FCM_S2:
function IMMM=fcms1(IM)
%IM是输入的源图像
%IX2是分类结果IM=imread('012.bmp');
%subplot(2,3,1),imshow(uint8(IM)),title('原始图像');
IM=IM(:,:,1);
%subplot(2,3,2),imshow(uint8(IM)),title('灰度图像');
[maxX,maxY]=size(IM);%图像大小
%IM = imnoise(IM,'salt & pepper',0.02);
%IM=imnoise(IM,'gaussian',0,0.002);
%subplot(2,3,3),imshow(uint8(IM)),title('加噪图像');
IM=double(IM);
a=fspecial('average',3) ;
IM= filter2(a,IM);%进行中值滤波;
%subplot(2,3,4),imshow(uint8(IM)),title('均值滤波图像');IMM=cat(3,IM,IM,IM,IM,IM,IM);
%初始化聚类中心(3类)
cc1=20;
cc2=130;
cc3=240;
ttFcm=0;%聚类次数,最多15次
while(ttFcm<15)ttFcm=ttFcm+1;c1=cc1*ones(maxX,maxY);c2=cc2*ones(maxX,maxY);c3=cc3*ones(maxX,maxY);c=cat(3,c1,c2,c3,c1,c2,c3);%计算隶属度u distance=IMM-c;distance=distance.*distance ;%3维矩阵distance1=distance(:,:,1)+1.8*distance(:,:,4);distance2=distance(:,:,2)+1.8*distance(:,:,5);distance3=distance(:,:,3)+1.8*distance(:,:,6);u1=distance1./(distance1+distance2+distance3);u2=distance2./(distance1+distance2+distance3);u3=distance3./(distance1+distance2+distance3);%计算聚类中心c:ccc1=sum(sum(u1.*u1.*(IM+1.8*IM)))/(2.8*sum(sum(u1.*u1)));ccc2=sum(sum(u2.*u2.*(IM+1.8*IM)))/(2.8*sum(sum(u2.*u2)));ccc3=sum(sum(u3.*u3.*(IM+1.8*IM)))/(2.8*sum(sum(u3.*u3)));tmpMatrix=[abs(cc1-ccc1)/cc1,abs(cc2-ccc2)/cc2,abs(cc3-ccc3)/cc3];pp=cat(3,u1,u2,u3);for i=1:maxX;for j=1:maxY;if max(pp(i,j,:))==u1(i,j)IX2(i,j)=1;elseif max(pp(i,j,:))==u2(i,j)IX2(i,j)=2;elseIX2(i,j)=3;endendend%判结束条件if max(tmpMatrix)<0.00001break;elsecc1=ccc1;cc2=ccc2;cc3=ccc3;endfor i=1:maxX;for j=1:maxY;if IX2(i,j)==3IMMM(i,j)=0;elseif IX2(i,j)==2IMMM(i,j)=0;elseIMMM(i,j)=255;endendend
endfor i=1:maxX;for j=1:maxY;if IX2(i,j)==3IMMM(i,j)=0;elseif IX2(i,j)==2IMMM(i,j)=0;elseIMMM(i,j)=255;endendend%显示最终分类结果subplot(1,3,2),imshow(IMMM),
IMMM=uint8(IMMM);
title('FCM_S1聚类结果');
%end
function IMMM=fcms2(IM)
%IM是输入的源图像
%IX2是分类结果
%IM=imread('012.bmp');%subplot(2,3,1),imshow(uint8(IM)),title('原始图像');IM=IM(:,:,1);
%subplot(2,3,2),imshow(uint8(IM)),title('灰度图像');
[maxX,maxY]=size(IM);%图像大小
%IM = imnoise(IM,'salt & pepper',0.02);
%IM=imnoise(IM,'gaussian',0,0.002);
%subplot(2,3,3),imshow(uint8(IM)),title('加噪图像');
IM=double(IM);
IM=medfilt2(IM,[3,3]);%进行中值滤波;
%subplot(2,3,4),imshow(uint8(IM)),title('中值滤波图像');IMM=cat(3,IM,IM,IM,IM,IM,IM);
%初始化聚类中心(3类)
cc1=20;
cc2=130;
cc3=240;
ttFcm=0;%聚类次数,最多15次
while(ttFcm<15)ttFcm=ttFcm+1;c1=cc1*ones(maxX,maxY);c2=cc2*ones(maxX,maxY);c3=cc3*ones(maxX,maxY);c=cat(3,c1,c2,c3,c1,c2,c3);%计算隶属度u distance=IMM-c;distance=distance.*distance ;%3维矩阵distance1=distance(:,:,1)+1.8*distance(:,:,4);distance2=distance(:,:,2)+1.8*distance(:,:,5);distance3=distance(:,:,3)+1.8*distance(:,:,6);u1=distance1./(distance1+distance2+distance3);u2=distance2./(distance1+distance2+distance3);u3=distance3./(distance1+distance2+distance3);%计算聚类中心c:ccc1=sum(sum(u1.*u1.*(IM+1.8*IM)))/(2.8*sum(sum(u1.*u1)));ccc2=sum(sum(u2.*u2.*(IM+1.8*IM)))/(2.8*sum(sum(u2.*u2)));ccc3=sum(sum(u3.*u3.*(IM+1.8*IM)))/(2.8*sum(sum(u3.*u3)));tmpMatrix=[abs(cc1-ccc1)/cc1,abs(cc2-ccc2)/cc2,abs(cc3-ccc3)/cc3];pp=cat(3,u1,u2,u3);for i=1:maxXfor j=1:maxYif max(pp(i,j,:))==u1(i,j)IX2(i,j)=1;elseif max(pp(i,j,:))==u2(i,j)IX2(i,j)=2;elseIX2(i,j)=3;endendend%判结束条件if max(tmpMatrix)<0.00001break;elsecc1=ccc1;cc2=ccc2;cc3=ccc3;endfor i=1:maxXfor j=1:maxYif IX2(i,j)==3IMMM(i,j)=0;elseif IX2(i,j)==2IMMM(i,j)=0;elseIMMM(i,j)=255;endendendendfor i=1:maxX;for j=1:maxY;if IX2(i,j)==3IMMM(i,j)=0;elseif IX2(i,j)==2IMMM(i,j)=0;elseIMMM(i,j)=255;endendend%显示最终分类结果
IMMM=uint8(IMMM);
%subplot(1,3,3),imshow(IMMM),
title('FCM_S2聚类结果');
%end
1.4 加强模糊聚类EnFCM (Enhanced Fuzzy C-Means Clustering):
function IMMM=enfcm(IM)
%IM是输入的源图像
%IX2是分类结果IM=imread('001.jpg');
%subplot(2,2,1),imshow(uint8(IM)),title('原始图像');
IM=uint8(IM);
IM=IM(:,:,1);
%subplot(2,2,2),imshow(uint8(IM)),title('灰度图像');
[maxX,maxY]=size(IM);%图像大小
%IM = imnoise(IM,'salt & pepper',0.02);
%IM=imnoise(IM,'gaussian',0,0.002);
IM=double(IM);a=[1,1,1;1,0,1;1,1,1];IM=1/2.8 *(0.125* filter2(a,IM)+IM);%参数a=0.5
%subplot(2,2,3),imshow(uint8(IM)),title('变换图像');
IMM=cat(3,IM,IM,IM);%初始化聚类中心(3类)ttFcm=0;%聚类次数,最多15次
cc1=8;
cc2=120;
cc3=200;
while(ttFcm<15)ttFcm=ttFcm+1;c1=cc1*ones(maxX,maxY);c2=cc2*ones(maxX,maxY);c3=cc3*ones(maxX,maxY);c=cat(3,c1,c2,c3);ree=repmat(0.00001,maxX,maxY);ree1=cat(3,ree,ree,ree);distance=IMM-c;distance=distance.*distance+ree1;%计算隶属度udistance1=double( distance(:,:,1)+distance(:,:,2)+distance(:,:,3));u1=distance(:,:,1)./distance1;u2=distance(:,:,2)./distance1; u3=distance(:,:,3)./distance1;%计算聚类中心cr=zeros(1,256); %创建一个全零矩阵,1×256,计算各灰度出现的次数 for i=1:256r(i)=length(find(IM == (i-1))); endIM=uint8(IM);uu1=zeros(1,256);uu2=zeros(1,256);uu3=zeros(1,256);for m=1:1:maxX*maxYuu1(IM(m)+1)=u1(m); uu2(IM(m)+1)=u2(m);uu3(IM(m)+1)=u3(m); endx=1:1:256; ccc1=double(sum(r.*x.*uu1.*uu1)/sum(r.*uu1.*uu1));ccc2=double(sum(r.*x.*uu2.*uu2)/sum(r.*uu2.*uu2));ccc3=double(sum(r.*x.*uu3.*uu3)/sum(r.*uu3.*uu3));abs1=abs(cc1-ccc1)/cc1;abs2=abs(cc2-ccc2)/cc2;abs3=abs(cc3-ccc3)/cc3;tmpMatrix=[abs1,abs2,abs3];pp=cat(3,u1,u2,u3);for i=1:maxXfor j=1:maxYmax1=max([pp(i,j,1),pp(i,j,2),pp(i,j,3)]);if max(max1)==u1(i,j)IX2(i,j)=1;elseif max(max1)==u2(i,j)IX2(i,j)=2;elseIX2(i,j)=3;endendend%判结束条件if max(tmpMatrix)<0.000000001break;elsecc1=ccc1;cc2=ccc2;cc3=ccc3;endfor i=1:maxXfor j=1:maxYif IX2(i,j)==3IMMM(i,j)=20;elseif IX2(i,j)==2IMMM(i,j)=255;elseIMMM(i,j)=255;endendendendfor i=1:maxXfor j=1:maxYif IX2(i,j)==3IMMM(i,j)=20;elseif IX2(i,j)==2IMMM(i,j)=255;elseIMMM(i,j)=255;endendend%显示最终分类结果subplot(1,2,1),imshow(IMMM),
IMMM=uint8(IMMM);
title('EnFCM聚类结果');
1.5 模糊局部信息聚类FLICM(Fuzzy Local Information C-Means Clustering Algorithm):
function IMMM = flicm(IM)
%function [IX2]=flicm(IM);
%IM是输入的源图像
%IX2是分类结果
%IM=imread(IM);
%figure(1)
%subplot(2,2,1),imshow(uint8(IM)),title('原始图像');
IM=IM(:,:,1);
%subplot(2,2,2),imshow(uint8(IM)),title('灰度图像');
[maxX,maxY]=size(IM);%图像大小
%IM = imnoise(IM,'salt & pepper',0.02);
%IM=imnoise(IM,'gaussian',0,0.002);
IM=double(IM);
IMM=cat(3,IM,IM,IM);
%初始化聚类中心(3类)
cc1=8;
cc2=100;
cc3=200;ttFcm=0;%聚类次数,最多15次
a=[1,1,1;1,0,1;1,1,1];
b=ones(maxX,maxY);
ggg1=80*rand(maxX,maxY);
ggg2=80*rand(maxX,maxY);
ggg3=80*rand(maxX,maxY);
g=cat(3,ggg1,ggg2,ggg3);while(ttFcm<15)ttFcm=ttFcm+1;c1=repmat(cc1,maxX,maxY); %产生一个全CC1的m*n的矩阵c2=repmat(cc2,maxX,maxY);c3=repmat(cc3,maxX,maxY);c=cat(3,c1,c2,c3); %聚类中心矩阵ree=repmat(0.001,maxX,maxY);ree1=cat(3,ree,ree,ree);distance0=IMM-c; %d=每一个像素点和聚类中心的距离distance=distance0.*distance0+ree1+g;%计算每个像素点属于各类的隶属度udaoshu=1./distance;daoshu2=daoshu(:,:,1)+daoshu(:,:,2)+daoshu(:,:,3);distance1=distance(:,:,1).*daoshu2;u1=1./distance1;distance2=distance(:,:,2).*daoshu2;u2=1./distance2;distance3=distance(:,:,3).*daoshu2;u3=1./distance3;%计算模糊算子gg1=(b-u1).*(b-u1).*distance(:,:,1);g1=0.5*imfilter(gg1,a);gg2=(b-u1).*(b-u2).*distance(:,:,2);g2=0.5*imfilter(gg2,a);gg3=(b-u1).*(b-u3).*distance(:,:,3);g3=0.5*imfilter(gg3,a);g=cat(3,g1,g2,g3);%计算聚类中心cccc1=sum(sum(u1.*u1.*IM))/sum(sum(u1.*u1));ccc2=sum(sum(u2.*u2.*IM))/sum(sum(u2.*u2));ccc3=sum(sum(u3.*u3.*IM))/sum(sum(u3.*u3));tmpMatrix=[abs(cc1-ccc1)/cc1,abs(cc2-ccc2)/cc2,abs(cc3-ccc3)/cc3];pp=cat(3,u1,u2,u3);%隶属度矩阵for i=1:maxXfor j=1:maxYif max(pp(i,j,:))==u1(i,j)IX2(i,j)=1;elseif max(pp(i,j,:))==u2(i,j)IX2(i,j)=2;elseIX2(i,j)=3;endendend%判结束条件if max(tmpMatrix)<0.0001break;elsecc1=ccc1;cc2=ccc2;cc3=ccc3;endfor i=1:maxXfor j=1:maxYif IX2(i,j)==3IMMM(i,j)=240;elseif IX2(i,j)==2IMMM(i,j)=0;elseIMMM(i,j)=0;endendend%显示每次聚类分割结果%subplot(2,2,3),imshow(uint8(IMMM)),title('第3次聚类结果');
endfor i=1:maxXfor j=1:maxYif IX2(i,j)==3IMMM(i,j)=240;elseif IX2(i,j)==2IMMM(i,j)=0;elseIMMM(i,j)= 0;endend
end
%显示最终分类结果
IMMM=uint8(IMMM);
%axes(handles.axes5);
%subplot(1,2,2),
%imshow(IMMM),title('FLICM聚类结果');
End
1.6 FCM系列算法综述与对比
FCM算法是一种基于划分的聚类算法,它的思想就是使得被划分到同一簇的对象之间相似度最大,而不同簇之间的相似度最小。它是K-means聚类的一种延伸。K-means也叫硬C均值聚类(HCM),而FCM是模糊C均值聚类,HCM与FCM最大的区别在于隶属函数(划分矩阵)的取值不同,HCM的隶属函数只取两个值:0和1,而FCM的隶属函数可以取[0,1]之间的任何数。K-means和FCM都需要事先给定聚类的类别数,而FCM还需要选取恰当的加权指数α,α的选取对结果有一定的影响,α属于[0,+∞)。
FCM_S对经典FCM的目标函数进行了修改,以补偿强度的不均匀性,并允许像素的标记受到其紧邻像素的影响。 FCM_S的一个缺点是在每个迭代步骤中都要计算邻域标签,这非常耗时。而FCM_S1和FCM_S2为了减少计算时间分别引入了额外的均值和中值滤波图像,这些图像可以预先计算,以代替FCM_S的邻域项。因此,FCM_S1和FCM_S2的执行时间都大大减少了。
EnFCM的结构不同于FCM_S及其变体。 首先,由原始图像和每个像素的局部邻域平均灰度级形成线性加权和图像。 然后,基于灰度直方图而不是求和图像的像素执行聚类。 由于图像中的灰度级数通常比其像素数小得多,因此减少了EnFCM算法的计算时间,而分割后的图像的质量与FCM_S几乎一致。
FLICM是一种新颖的鲁棒的模糊局部信息聚类算法,该算法可以处理参数α选择的缺陷,并提高图像分割性能。在FLICM中,定义了一种新颖的模糊因子来替换EnFCM和FCM S及其变体中使用的参数α。新的模糊局部邻域因子可以自动确定空间和灰度关系,并且完全不需要任何参数选择。
二、实验结果总结
2.1 主观评价(效果图对比)
FCM只是对每一个像素点的灰度值作用,故噪声对分割影响较大;FCM_S加入了对紧邻像素的考虑,其变体1,2通过对像素点的邻域求和均值中值化,对图像进行了滤波预处理,受噪声影响相对较小
图2.1原图(左)与FCM(右)
由于均值滤波和中值滤波可以较好地抑制高斯噪声和椒盐噪声的影响,因而 FCM_S1 算法和 FCM_S2 算法可以获得比 FCM 算法更好的分割结果从所示的实验结果可以看出,FCM_S1 算法和 FCM_S2 算法同FCMS 算法一样,其分割结果都比较接近理想的分割结果,而这两种变体的运行效率则远胜FCMS。
图2.2 FCM_S(左)、FCM_S1(中)与FCM_S2(右)
仔细比较 FCMS 算法、FCM_S1 算法和 FCM_S2 算法,可以发现:三种算法的分割结果不相上下,而FCM_S1 算法和 FCM_S2 算法的运行效率比 FCMS 算法略胜一筹。
EnFCM通过线性加权对图像进行了预处理,运行效率较高,效果与FCMS几乎一致;
图2.3 EnFCM算法
上述改进的 FCM 算法获得了相比原 FCM 算法更好的分割结果,但是所考虑的邻域像素对中心像素影响并不准确,即邻域内所有像素对中心像素的影响程度一样,均由参数决定,致使分割结果并不是很理想。上述改进的 FCM 算法在图像中边界处的分割并不准确。
总而言之,尽管上述模糊聚类改进算法有较好的分割效果,但是他们仍有许多不足之处:
(1)对噪声和离值缺乏鲁棒性;
(2)参数选择难,需要反复试验来确定最佳参数;
(3)预先对图像进行滤波处理,会导致丢失图像细节。
FLICM算法解决了上述问题,首先,利用 Gij(模糊因子)不包含除必要参数m、C 之外的其它参数,因此无需通过调整参数(例如 EnFCM 算法中的c)来平衡
图像噪声和图像细节,并且,该算法能够利用空间信息和灰度信息,相对于传统的FCM 算法,对于含有噪声的图像,分割效果有了极大的改善。
图2.4 FLICM算法
2.2 客观评价(经典评价指数)
FCM广泛应用于数据聚类和图像分割领域,如何判定该算法的优劣性,是评价数据分类好坏和分割技术高低的关键。其中有几种经典的评价指数:
图2.5评价指数对应含义
具体数值上:Bezdek划分系数Bezdek_V 越大越好,Xie_Beni系数Xie_Beni_V和重构错误率V_RE越小越好。图片选择与处理过程同4.1,经过编程计算,
FCM的Bezdek_V , Xie_Beni_V , V_RE指数分别为9.8529e+04,2.0236e+09,1.5668e-28。FCMS的Bezdek_V , Xie_Beni_V , V_RE指数分别为4.1266e+04,8.1853e+08,1.9594e-28。FCM_S1的Bezdek_V , Xie_Beni_V , V_RE指数分别为7.7576e+04,1.7790e+09 ,2.4023e-28。FCM_S2的Bezdek_V , Xie_Beni_V , V_RE指数分别为 7.7445e+04,1.8006e+09,2.7378e-28。EnFCM的Bezdek_V , Xie_Beni_V , V_RE指数分别为7.6878e+04,9.1414e+08,1.1463e-28。FLICM的Bezdek_V , Xie_Beni_V , V_RE指数分别为1.1685e+05,2.3636e+09,1.0644e-28。如下表
FCM |
FCMS |
FCM_S1 |
FCM_S2 |
EnFCM |
FLICM |
|
Bezdek_V |
9.8529 e+04 |
4.1266 e+04 |
7.7576 e+04 |
7.7445 e+04 |
7.6878 e+04 |
1.1685 e+05 |
Xie_Beni |
2.0236 e+09 |
8.1853 e+08 |
1.7790 e+09 |
1.8006 e+09 |
9.1414 e+08 |
2.3636 e+09 |
V_RE |
1.5668 e-28 |
1.9594 e-28 |
2.4023 e-28 |
2.7378 e-28 |
1.1463 e-28 |
1.0644 e-28 |
表2.1 三种评价指数具体数值
从Bezdek划分系数Bezdek_V出发,FLICM效果最理想。
从Xie_Beni系数Xie_Beni_V出发,FLICM效果最理想。
从重构错误率V_RE出发,FCM_S2效果最理想。
function [ Bezdek_V , Xie_Beni_V , V_RE ] = Evaluation_index( U,I,V )
% Evaluation_index函数是为了判定分割评价指数
% 输出:Bezdek划分系数Bezdek_V、Xie_Beni系数Xie_Beni_V 和重构错误率V_RE构成。
% 输入:隶属度矩阵U、聚类中心V和原始灰度图像矩阵I。
% Bezdek划分系数Bezdek_V 越大越好
% Xie_Beni系数Xie_Beni_V和重构错误率V_RE越小越好
Bezdek_V=0;
Xie_Beni_V=0;
V_RE=0;
[M,N,c]=size(U);
I_RE=zeros(M,N);
min_V=(V(1)-V(2))^2;
for x=1:cfor y=1:cif(x-y~=0&&min_V>(V(x)-V(y))^2)min_V=(V(x)-V(y))^2;endend
end
for x=1:Mfor y=1:Ntemp=0;temp1=0;for k=1:cBezdek_V=Bezdek_V+ U(x,y,k)^2;Xie_Beni_V=Xie_Beni_V+U(x,y,k)^2*(I(x,y)-V(k))^2;temp=temp+U(x,y,k)^2*I(x,y);temp1=temp1+U(x,y,k)^2;endI_RE(x,y)=temp/temp1;end
end
for x=1:Mfor y=1:NV_RE=V_RE+(I_RE(x,y)-I(x,y))^2;end
end
V_RE=V_RE/M/N;
End
原文下载地址
https://download.csdn.net/download/weixin_47502228/87349472
基于FCM算法优化的图像分割研究(附源代码)相关推荐
- 基于灰狼算法优化的lssvm回归预测-附代码
基于灰狼算法优化的lssvm回归预测 - 附代码 文章目录 基于灰狼算法优化的lssvm回归预测 - 附代码 1.数据集 2.lssvm模型 3.基于灰狼算法优化的LSSVM 4.测试结果 5.Mat ...
- 【预测模型-ELM预测】基于麻雀算法优化极限学习机预测附matlab代码
1 内容介绍 一种基于麻雀搜索算法优化极限学习机的风电功率预测方法,具体包括如下步骤:步骤1,确定影响风电功率的主导影响因子:步骤2,构建麻雀搜索算法优化核极限学习机预测模型,通过该模型对风电功率进行 ...
- 基于萤火虫算法优化的lssvm回归预测附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.
- 【回归预测-FNN预测】基于蝙蝠算法优化前馈网络实现数据回归预测附Matlab代码
1 内容介绍 强大的非线性映射能力使得人工神经网络越来越多地应用于数值预测.工程控制中,但神经网络在学习过程中,不可避免的存在着全局搜索能力差.容易跳入局部最优等不足,因而用神经网络技术预测的数据并不 ...
- 基于蝙蝠算法优化BP神经网络的数据分类算法及其MATLAB实现-附代码
基于蝙蝠算法优化BP神经网络的数据分类算法及其MATLAB实现-附代码 文章目录 基于蝙蝠算法优化BP神经网络的数据分类算法及其MATLAB实现-附代码 1 蝙蝠算法与BP神经网络分类模型 1.1 蝙 ...
- 基于布谷鸟算法优化的Elman神经网络数据预测-附代码
基于布谷鸟算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于布谷鸟算法优化的Elman神经网络数据预测 - 附代码 1.Elman 神经网络结构 2.Elman 神经用络学习过程 3.电 ...
- 基于灰狼算法优化支持向量机的数据分类算法及其MATLAB实现-附代码
基于灰狼算法优化支持向量机的数据分类算法及其MATLAB实现-附代码 文章目录 基于灰狼算法优化支持向量机的数据分类算法及其MATLAB实现-附代码 1 GWO-SVM 模型 1.1 灰狼优化器GWO ...
- 基于灰狼算法优化概率神经网络PNN的分类预测-附代码
基于灰狼算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于灰狼算法优化概率神经网络PNN的分类预测 - 附代码 1.PNN网络概述 2.变压器故障诊街系统相关背景 2.1 模型建立 3. ...
- 基于鲸鱼算法优化的Elman神经网络数据预测-附代码
基于鲸鱼算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于鲸鱼算法优化的Elman神经网络数据预测 - 附代码 1.Elman 神经网络结构 2.Elman 神经用络学习过程 3.电力负 ...
最新文章
- Python中文件路径如果需要回退到上一级怎么办?
- Java字符串处理之返回指定字符串下标(indexOf)
- Java实现的基于socket的一次通信
- Gerrit 服务搭建和升级详解(包括 H2 数据库迁移 MySQL 步骤)
- 在Linux下面的某一个文件的查找命令
- grep命令--文件过滤分割与合并
- 给你的页面加一个百度地图
- 好用的小工具系列之---lombok--扔掉傻瓜式书写,精简你的代码,节约你的时间
- Java后台框架篇--Spring与Restful风格API接口开发
- 修改sql数据库服务器名称,如何更改sql数据库服务器名称
- 二值图像数字水印技术的实现
- 微信开放平台授权登录详细流程-第三方登录
- 国外11个高质量免费的3D素材网站-建筑设计/室内设计/效果图渲染
- C语言读写SQLite数据库
- MarkdownPad2 的基本使用
- 终端常用的命令及功能
- Pivotal中国研发中心总经理冯雷受邀参加2017金融证券行业大数据高峰论坛
- 28.QT-QPainter介绍
- SQL Server中替换函数stuff、replace的使用
- 易读代码的艺术之Code Should Be Easy to Understand