The Robust Fuzzy C-means
摘要:
基于FCM的在图像处理方面对噪声敏感的不足,本文通过引入空间模型建立空间模糊C均值聚类提高算法的鲁棒性,在此基础上,结合抑制式对算法进一步优化。最后,给图像加不同程度的噪声,通过MATLAB编程,分析比较各个算法的迭代次数、迭代时间、错误率以及均方根误差判断算法的优劣。
一 空间模糊聚类概述
之前对FCM做了简单介绍,通过实验发现其有一定的缺点,为此我们需要对算法进行一系列的优化,今天主要来分析一下空间模糊聚类,改善算法的鲁棒性。
1. FCM
在之前对FCM已经做过介绍,在此不再赘述,今天主要分析的是FCM在图像处理方面的应用,虽然FCM有着广泛适用性等优点,但FCM算法对噪声敏感这一点也是毋庸置疑的。FCM的目标函数:

其中,yj指的是各个样本点对应的像素,取值为[0,255]。很明显,FCM并没有考虑到样本之间的空间相关性,只是分别考虑各个样本。减小噪声敏感程度的方法很多,比如在处理图像之前首先平滑图像,但这个方法会在一定程度上丢失样本中某些特性;还可以通过对隶属度函数的后处理等等,然而,我们今天讲到的空间模型是通过直接修改目标函数提高算法对噪声的鲁棒性。
2. The Roubst Fuzzy C-means(RFCM)
结合空间模型,为提高鲁棒性,RFCM在计算距离时考虑到每个样本点的邻域样本,也就将各个样本的空间相关性结合起来。在FCM算法的基础之上,得到RFCM的目标函数:

结合FCM的约束条件,引入拉格朗日因子进一步推导,得到的隶属度矩阵的计算公式为:

相应的聚类中心的计算公式为:

3. 抑制式
抑制式主要是对最大隶属度进行适当的放大,从而抑制其它隶属度,提高收敛速度,其中抑制式因子为:

通过将隶属度函数与抑制式因子相乘,即可对算法进行抑制式修改。
二 MATLAB实现
为了比较算法的优劣,将算法作用于不同图像,并且分别加不同程度的高斯白噪声,分别比较算法的迭代次数,执行时间,错误率和均方根误差,这些在代码中均有说明。
1. RFCM
基于上面的介绍,可得到RFCM算法的步骤如下:
首先,给定一个由N个L维向量组成的数据集X以及所要分得的类别个数C,并且自定义隶属度矩阵
(1)初始化隶属度矩阵并归一
(2)根据聚类中心的计算公式更新聚类中心
(3)根据隶属度矩阵的计算公式更新隶属度
(4)不断的重复(2)直到收敛。
不知道大家有没有发现这和FCM的算法步骤大致是一样的,不同是在目标函数当中,当然体现在代码当中,而最终反映在算法的性能当中。
根据算法的步骤,采用MATLAB编程实现,在此导入MR图像,代码如下:
clear all
clc;
a=imread('MRI.jpg');
I=imnoise(a,'salt & pepper',0.03);
figure();
imshow(I);title('加噪图像');
[height,width,c]=size(a);
a=rgb2gray(a);
end
a=double(a);
[row,column]=size(a);
data = a(:);
data_n = size(data,);
beta = ;
cluster_num = 3;%将图像分为三类
default_options = [2.0; % exponent for the partition matrix U
; % max. number of iteration
0.01; % min. amount of improvement
]; % info display during iteration
options = default_options;
m = options(); % p,图像的质量参数
iter_num = options(); % Max. iteration 最大迭代次数
threshold = options(); % Min. improvement 最小进化步长
display = options(); % Display info or not 显示信息与否
costfunction = zeros(iter_num, );
tic
% 初始化隶属度并归一
membership = zeros(height,width,cluster_num);
:height
:width
member_sum=;
:cluster_num
membership(i,j,k)=rand();
member_sum=member_sum + membership(i,j,k);
end
:cluster_num
membership(i,j,p)=membership(i,j,p)/member_sum;
end
end
end
:iter_num %迭代次数控制
%计算初始中心
center = zeros(cluster_num,);
:cluster_num
sum = ;
sum1 = ;
:height
:width
sum = sum + (membership(h,t,u).^m) * a(h,t);
sum1 = sum1 + membership(h,t,u).^m;
end
end
center(u) = sum/sum1;
end
:height
:width
up = i-;
down = i+;
left = j-;
right = j+;
)
up = ;
end
if( down > height)
down = height;
end
)
left = ;
end
if( right > width)
right = width;
end
s = ;
for x = up : down
for y = left : right
:cluster_num
:cluster_num
s = s + membership(x,y,r).^m;
end
s = s - membership(x,y,u).^m;
end
end
end
end
end
:height
:width
:cluster_num
costfunction(o) = costfunction(o) + membership(h,t,k).^m*(a(h,t) - center(k))^ + (beta/) * membership(h,t,k)^m*s;
tmp = ((a(h,t)-center(k))^ + beta * s).^(-/(m - ));
tomp = ;
:cluster_num
tomp = tomp + (a(h,t)-center(p))^;
tp = (tomp + beta * s) .^(-/(m - ));
end
membership(h,t,k) = tmp./tp;
end
end
end
%%%%%%归一化隶属度
:height
:width
member_sum = ;
:cluster_num
member_sum = member_sum + membership(i,j,k);
end
:cluster_num
membership(i,j,p) = membership(i,j,p) / member_sum;
end
end
end
if display,
fprintf('Iteration count = %d, obj. fcn = %f\n', o, costfunction(o));
%输出迭代次数和函数的结果
end
% check termination condition
, %进化步长控制
)) < threshold, break; end,
end
end
toc
A = ones(height,width,);
:height
:width
) == )
A(i,j,) = ;
end
) == )
A(i,j,) = ;
end
) / ) == )
A(i,j,) = ;
end
end
end
A = reshape(A,,data_n);
newing = zeros(row,column);
:row
:column
maxmembership=membership(i,j,);
index=;
:cluster_num
if(membership(i,j,k)>maxmembership)
maxmembership=membership(i,j,k);
index=k;
end
end
newing(i,j) = round( * (-(index-)/(cluster_num-)));
end
end
B = reshape(newing,,data_n);
b = fix((max(B) - B(,)) / cluster_num);
:data_n
,i) == B(,)
B(,i) = ;
elseif (fix(B(,i) / b) == )
B(,i) = ;
elseif (fix(B(,i) / b) == )
B(,i) = ;
else
B(,i) = ;
end
end
B(,) = ;
sum = ;
:data_n
,i) ~= B(,i))
sum = sum + ;
end
end
MCR = sum / data_n;
fprintf('MCR = %d\n',MCR);
S = ;
:data_n
S = S + (A(,i) - B(,i)).^;
end
RMS = sqrt(S / (data_n * (data_n - )));
fprintf('RMS = %d\n',RMS);
figure();
imshow((uint8(newing)));
title('RFCM分割后的图像');
2. 抑制式RFCM
将抑制式因子作用于隶属度矩阵,采用MATLAB编程实现,代码如下:
clear all
clc;
a=imread('MRI.jpg');
I=imnoise(a,'salt & pepper',0.03);
figure();
imshow(I);title('加噪图像');
[height,width,c]=size(a);
a=rgb2gray(a);
end
a=double(a);
[row,column]=size(a);
data = a(:);
data_n = size(data,);
beta = ;
cluster_num = ;%将图像分为四类
default_options = [2.0; % exponent for the partition matrix U
; % max. number of iteration
0.01; % min. amount of improvement
]; % info display during iteration
options = default_options;
m = options(); % p,图像的质量参数
iter_num = options(); % Max. iteration 最大迭代次数
threshold = options(); % Min. improvement 最小进化步长
display = options(); % Display info or not 显示信息与否
costfunction = zeros(iter_num, );
tic
% 初始化隶属度并归一
membership = zeros(height,width,cluster_num);
:height
:width
member_sum=;
:cluster_num
membership(i,j,k)=rand();
member_sum=member_sum + membership(i,j,k);
end
:cluster_num
membership(i,j,p)=membership(i,j,p)/member_sum;
end
end
end
:iter_num %迭代次数控制
%计算初始中心
center = zeros(cluster_num,);
:cluster_num
sum = ;
sum1 = ;
:height
:width
sum = sum + (membership(h,t,u).^m) * a(h,t);
sum1 = sum1 + membership(h,t,u).^m;
end
end
center(u) = sum/sum1;
end
:height
:width
up = i-;
down = i+;
left = j-;
right = j+;
)
up = ;
end
if( down > height)
down = height;
end
)
left = ;
end
if( right > width)
right = width;
end
s = ;
for x = up : down
for y = left : right
:cluster_num
:cluster_num
s = s + membership(x,y,r).^m;
end
s = s - membership(x,y,u).^m;
end
end
end
end
end
:height
:width
:cluster_num
costfunction(o) = costfunction(o) + membership(h,t,k).^m*(a(h,t) - center(k))^ + (beta/) * membership(h,t,k)^m*s;
tmp = ((a(h,t)-center(k))^ + beta * s).^(-/(m - ));
tomp = ;
:cluster_num
tomp = tomp + (a(h,t)-center(p))^;
tp = (tomp + beta * s) .^(-/(m - ));
end
membership(h,t,k) = tmp./tp;
end
end
end
%%%%%%归一化隶属度
:height
:width
member_sum = ;
:cluster_num
member_sum = member_sum + membership(i,j,k);
end
:cluster_num
membership(i,j,p) = membership(i,j,p) / member_sum;
end
end
end
%%%%%%%抑制式修改
ha = ;
:height
:width
:cluster_num
ha = ha + membership(i,j,p).^;
end
end
end
alpha = ( cluster_num/(cluster_num - )) * ( -(/data_n) * ha);
membership1 = membership.*alpha;
:height
:width
[max_data,max_local] = max(membership(i,j,:));
temembership = alpha.* membership(i,j,max_local) + ( - alpha);
membership1(i,j,max_local) = temembership;
end
end
membership = membership1 * alpha;
:height
:width
member_sum = ;
:cluster_num
member_sum = member_sum + membership(i,j,k);
end
:cluster_num
membership(i,j,p) = membership(i,j,p) / member_sum;
end
end
end
if display,
fprintf('Iteration count = %d, obj. fcn = %f\n', o, costfunction(o));
%输出迭代次数和函数的结果
end
% check termination condition
, %进化步长控制
)) < threshold, break; end,
end
end
toc
A = ones(height,width,);
:height
:width
) == )
A(i,j,) = ;
end
) == )
A(i,j,) = ;
end
) / ) == )
A(i,j,) = ;
end
end
end
A = reshape(A,,data_n);
newing = zeros(row,column);
:row
:column
maxmembership=membership(i,j,);
index=;
:cluster_num
if(membership(i,j,k)>maxmembership)
maxmembership=membership(i,j,k);
index=k;
end
end
newing(i,j) = round( * (-(index-)/(cluster_num-)));
end
end
B = reshape(newing,,data_n);
b = fix((max(B) - B(,)) / cluster_num);
:data_n
,i) == B(,)
B(,i) = ;
elseif (fix(B(,i) / b) == )
B(,i) = ;
elseif (fix(B(,i) / b) == )
B(,i) = ;
else
B(,i) = ;
end
end
B(,) = ;
sum = ;
:data_n
,i) ~= B(,i))
sum = sum + ;
end
end
MCR = sum / data_n;
fprintf('MCR = %d\n',MCR);
S = ;
:data_n
S = S + (A(,i) - B(,i)).^;
end
RMS = sqrt(S / (data_n * (data_n - )));
fprintf('RMS = %d\n',RMS);
figure();
imshow((uint8(newing)));
title('SRFCM分割后的图像');
3. 结果比较
加噪3%:

三种算法的处理结果:
进而结合这三种算法的迭代次数、运行时间和错误率以及均方根误差这些判断算法的优劣,很明显的是SRFCM性能优于RFCM优于FCM,在这里我就不一一说明了,代码执行多次验证即可。除此之外,还可以采取NMI,ARI等加以说明。
为了进一步验证,也可以自定义图像(参上一篇),或者再通过其它图像验证。
版权:本文为博主原创文章,未经博主允许不得转载!
The Robust Fuzzy C-means的更多相关文章
- Fuzzy C Means 算法及其 Python 实现——写得很清楚,见原文
Fuzzy C Means 算法及其 Python 实现 转自:http://note4code.com/2015/04/14/fuzzy-c-means-%E7%AE%97%E6%B3%95%E5% ...
- 图像处理------Fuzzy C Means的聚合算法
Fuzzy C-Means聚合算法在图像分割(segmentation)和图像视觉处理中常常被用到聚合算法之 一本文是完全基于JAVA语言实现Fuzzy C-Means聚合算法,并可以运用到图像处理中 ...
- 当我们在谈论kmeans(1)
本稿为初稿,后续可能还会修改:如果转载,请务必保留源地址,非常感谢! 博客园:http://www.cnblogs.com/data-miner/ 简书:建设中... 知乎:建设中... 当我们在谈论 ...
- R语言 模糊c均值(FCM)算法程序(转)
FCM <- function(x, K, mybeta = 2, nstart = 1, iter_max = 100, eps = 1e-06) { ## FCM ## INPUTS ## ...
- 机器学习:weka中添加自己的分类和聚类算法
不管是实验室研究机器学习算法或是公司研发,都有需要自己改进算法的时候,下面就说说怎么在weka里增加改进的机器学习算法. 一 添加分类算法的流程 1 编写的分类器必须继承 Classifier或是Cl ...
- Fuzzy Probability Theory---(2)Computing Fuzzy Probabilities
Let $X=\{x_1,x_2,...,x_n\}$ be a finite set and let $P$ be a probability function defined on all sub ...
- 全栈式框架的选择:MEAN or MEANS?
说明:个人博客地址为edwardesire.com,欢迎前来品尝.本博客作为备份和引流 这两个月一直在进行sails后端开发,其中遇到的问题不断.放在研究用户访问控制矸例程上的时间太多,最后也没用弄出 ...
- Robust Tracking via Weakly Supervised Ranking SVM
参考文献:Yancheng Bai and Ming Tang. Robust Tracking via Weakly Supervised Ranking SVM Abstract 通常的算法:ut ...
- K-means算法
K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢? ...
随机推荐
- Javascript 正则表达式笔记2
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- VS2012简单的使用感受+插件推荐
VS2012简单的使用感受+插件推荐http://www.cnblogs.com/tangge/archive/2013/03/12/2955367.html
- JAVA IO 体系
一.体系结构
- 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装
在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...
- PenetrationTest
一.渗透测试是什么 渗透测试(PenetrationTest)是对安全情况最客观.最直接的评估方式,主要是模拟黑客的攻击方法对系统和网络进行非破坏性质的攻击性测试,在保证整个渗透测试过程都在可以控制和 ...
- 关于Netty4.x中文教程系列更新进度的说明和道歉
最近一些事情.貌似发现很久没更新教程了.这里和大家说一声对不起.教程5的前半部分差不多年前就写好了.但是由于年前我在的项目组项目进度比较紧张.一直在加班.教程的后半部分就一直没有写.年后由于一些公司人 ...
- angularjs ngRoute demo
<!doctype html> <html lang="en" ng-app="AMail"> <head> <met ...
- adobeMediaServer
参考地址: http://www.piis.cn/news/new519.asp http://www.cuplayer.com/player/PlayerCode/RTMP/2012/0918427 ...
- 《Linux/Unix系统编程手册》读书笔记6
<Linux/Unix系统编程手册>读书笔记 目录 第9章 这章主要讲了一堆关于进程的ID.实际用户(组)ID.有效用户(组)ID.保存设置用户(组)ID.文件系统用户(组)ID.和辅助组 ...
- YTU 2615: AB编程题--世界杯小组赛
2615: AB编程题--世界杯小组赛 时间限制: 1 Sec 内存限制: 128 MB 提交: 100 解决: 35 题目描述 注:本题目自由设计,但必须使用类进行代码设计. 世界杯32支参赛队 ...