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类,我们怎么把它们划分呢? ...
随机推荐
- gcc: error trying to exec 'cc1plus': execvp: 没有那个文件或目录
问题: 解决办法: 1.没安装G++ 可使用 sudo apt-get install g++ 进行安装 2.gcc版本和g++版本不相符 可利用gcc -v和g++ -v 查看版本
- java_String和StringBuffer区别分析
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数值不可改变的字符串.而这个StringBuffer类提供 ...
- 编码,加解密,签名,Hash
工作中会听到各种各样是是而非的词汇,base64,url,sha256,rsa,hash等等,你能很好的分清这些词语吗? 这次我想把它们统一的整理说明下: 一: 编码 编码是信息从一种形式或格式转换为 ...
- 模拟登陆115网盘(MFC版)
[cpp] view plain copy // 模拟登陆115网盘 #include <afxinet.h> // 包含相关的头文件 /* 用抓包工具抓包可得到需要提交的数据,然后模拟提 ...
- 288. Unique Word Abbreviation
题目: An abbreviation of a word follows the form <first letter><number><last letter> ...
- Android 去掉title bar的3个方法
1. Java代码实现 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstance ...
- MVC+EF+Spring.Net代码生成器
最近研究学习了MVC.EF等相关技术,写了一套项目架构.只要更改EF模型,生成数据库并转换T4模版.数据层和业务层就可以自动生成了. 主要用到的技术: 1.EF实体框架. 2.Spring.Net依赖 ...
- java实现给图片添加水印
package michael.io.image; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.aw ...
- 《c程序设计语言》读书笔记--每行一个单词打印输入的字符,除去空符
#include <stdio.h> int main() { int c; while((c = getchar()) != EOF) { if(c != '\n' && ...
- PCB阻抗调节
在PCB厂家调节的阻抗指的是:传输线的“特征阻抗”,反映传输线上所走“行波”某点的电压和电流的比值,与线长无关.传输线本身的特性. 线宽:反比 介质厚度:正比