【图像分割】基于FLICM算法实现图像分割含Matlab源码
1 简介
聚类就是把具有相似性的事物区分开并加以分类。聚类分析是依据研究对象(样品
或指标)的特征,对其进行分类。其目标是:组内对象之间是相似的或是相关的,而不同组中的对象不相同或者是不相关的,聚类过程中要求分类准确,分类的过程和结果是可以重复的,但分类并不依赖于分析者的主观判断。聚类分析作为多元统计分析的方法之一,也是统计模式识别中的非监督模式识别的一个重要分支。
聚类可以看作是一种分类,用类标号从而创建对象的标记,多数情况下我们对于分
类识别的对象是未知的,因此聚类分析通常也被称为无监督分类。与此相反,用一个由类标号已知的对象建立的模型,对新的、无标记的对象赋予一个类的标号称为有监督分类。在现实中由于事物的复杂性,聚类对象之问的界限往往不是特别清晰,比如对于脑组织核磁共振图像这样的医学图像来说,由于不同脑组织(如白质、灰质和脑脊液)等混杂在一起会导致图像更加不清晰。因此使用基于多元统计分析的聚类方法分析脑组织核磁共振图像将会受到极大的限制。模糊集合的出现,让传统的聚类分析看到了曙光,从而出现了基于模糊集理论的聚类方法——模糊聚类分析。通过模糊聚类分析能够客观地描述具有不明性的对象,使得实际的聚类结果更加准确合理。
目前,应用最广泛的是模糊C均值聚类算法,简称FCM算法。该方法通过对目标函
数的迭代优化获取对数据集的模糊分类,即将聚类归结为一个带有约束的非线性规划问题,这种方法设计简单,可以转化为优化问题进行求解,在计算机上实现比较容易,另外,模糊C均值聚类在图像分割中是一种无监督模糊聚类的标定过程,因此这种方法从理论上看很适合医学图像的分割。
传统的 FCM 算法,对没有被噪声污染的图像有很好的分割效果,但对于被噪声污
染的图像,如图(3-1)所示,分割效果不太理想。这种对噪声敏感实质上是由于没有利用被分割像素的空间位置信息,忽略了像素之间的邻域信息,因此对于信噪比低的图像,分割效果很不理想。在图像分割过程中,既能减少各种噪声的干扰,又能对原始图像信息进行精确分类是基于标准 FCM 图像分割方法需要改进的一个方向。



2 部分代码
clear all;
clc;
% image = load('im.txt');
image = imread('017.jpg');
[row,col,channels] = size(image);
if (channels > 1)
image = rgb2gray(image);
figure;
subplot(131)
imshow(image);
title('原图像')
else
figure;
subplot(131)
imshow(image);
title('原图像')
end
%对输入图像进行高斯滤波
originimg=image;
originimg=mat2gray(originimg);
[ori_row,ori_col]=size(originimg);
sigma = 1.6; %sigma赋值
N = 7; %大小是(2N+1)×(2N+1)
N_row = 2*N+1;
OriImage_noise = imnoise(originimg,'gaussian'); %加噪
gausFilter = fspecial('gaussian',[N_row N_row],sigma); %matlab 自带高斯模板滤波
img=imfilter(OriImage_noise,gausFilter,'conv');
%figure;
subplot(132)
imshow(img);
title('高斯滤波后')
key_mat = []; % 定义一个空的关键像素矩阵
non_key_mat = []; %非关键像素矩阵
for i = 2:3:row
for j = 2:3:col
if row-i<1|col-j<1
continue;
end
window_image = img(i-1:i+1,j-1:j+1);
[r,c] = size(window_image);
max_value = max(max(window_image)); % 窗口最大值
[x,y] = find(window_image==max_value);
key_mat = [key_mat;[i-2+x(1),j-2+y(1),max_value]];
img(i-2+x(1),j-2+y(1))=-1;
% for m = 1:r
% for n = 1:c
% non_key_mat = [non_key_mat;i-2+m,j-2+n,window_image(m,n)];
% end
% end
end
end
[r,c]=find(img ~=-1);
value = (img(find(img ~=-1)));
non_key_mat = [r c value];
% for m = 1:row
% for n = 1:col
% tmp = [m,n,img(m,n)];
% if ismember(tmp,key_mat,'rows') == 1
% continue;
% end
% non_key_mat = [non_key_mat;tmp];
% end
% end
New_img = key_mat(:,3);
New_coord = key_mat(:,1:2);
cNum = 2;
m = 2;
winSize = 5;
maxIter = 59;
thrE = 0.00001;
% FLICM
[imOut,iter] = FLICM_clustering( New_img, cNum, m, winSize, maxIter, thrE );
imOut = double(imOut);
key_mat = [key_mat imOut];
figure;
gscatter(key_mat(:,1),key_mat(:,2),imOut);
size(non_key_mat);
size(key_mat);
key_mat;
%key_mat = sortrows(key_mat,[1 2])
%img(find(img==-1));
% [xx,yy] = find(img ==-1);
% key = sortrows([yy xx],1)
% img(find(img==-1)) = key_mat(:,4)
for i = 1:size(non_key_mat,1)
z = ones(1,size(key_mat,1))*non_key_mat(i,1);
z=z';
zc = ones(1,size(key_mat,1))*non_key_mat(i,2);
zc=zc';
size(key_mat(:,1));
dis = (z-key_mat(:,1)).* (z-key_mat(:,1))+(zc-key_mat(:,2)).*(zc-key_mat(:,2));
dis = sqrt(dis);
[labelx,labely] = min(dis);
dis = sort(dis);
xx = key_mat(labely,:);
img(non_key_mat(i,1),non_key_mat(i,2)) = xx(4);
end
for j = 1:size(key_mat,1)
img(key_mat(j,1),key_mat(j,2)) = key_mat(j,4);
end
% figure;
% imshow(img,[]);
subplot(133)
imagesc(label2rgb(img,'jet','w','shuffle'))
axis image; axis off;
set(gca,'position',[0 0 1 1]);
axis normal
title('FLFCM分割图')
3 仿真结果

4 参考文献
[1]詹新玲. 基于FLICM模糊聚类和水平集算法的医学图像分割[D]. 河北大学.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。
