摘要:

  基于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的更多相关文章

  1. Fuzzy C Means 算法及其 Python 实现——写得很清楚,见原文

    Fuzzy C Means 算法及其 Python 实现 转自:http://note4code.com/2015/04/14/fuzzy-c-means-%E7%AE%97%E6%B3%95%E5% ...

  2. 图像处理------Fuzzy C Means的聚合算法

    Fuzzy C-Means聚合算法在图像分割(segmentation)和图像视觉处理中常常被用到聚合算法之 一本文是完全基于JAVA语言实现Fuzzy C-Means聚合算法,并可以运用到图像处理中 ...

  3. 当我们在谈论kmeans(1)

    本稿为初稿,后续可能还会修改:如果转载,请务必保留源地址,非常感谢! 博客园:http://www.cnblogs.com/data-miner/ 简书:建设中... 知乎:建设中... 当我们在谈论 ...

  4. R语言 模糊c均值(FCM)算法程序(转)

    FCM <- function(x, K, mybeta = 2, nstart = 1, iter_max = 100, eps = 1e-06) { ## FCM ## INPUTS ## ...

  5. 机器学习:weka中添加自己的分类和聚类算法

    不管是实验室研究机器学习算法或是公司研发,都有需要自己改进算法的时候,下面就说说怎么在weka里增加改进的机器学习算法. 一 添加分类算法的流程 1 编写的分类器必须继承 Classifier或是Cl ...

  6. 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 ...

  7. 全栈式框架的选择:MEAN or MEANS?

    说明:个人博客地址为edwardesire.com,欢迎前来品尝.本博客作为备份和引流 这两个月一直在进行sails后端开发,其中遇到的问题不断.放在研究用户访问控制矸例程上的时间太多,最后也没用弄出 ...

  8. Robust Tracking via Weakly Supervised Ranking SVM

    参考文献:Yancheng Bai and Ming Tang. Robust Tracking via Weakly Supervised Ranking SVM Abstract 通常的算法:ut ...

  9. K-means算法

    K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢?  ...

随机推荐

  1. Linux网络编程3——socket

    宏定义 首先介绍两个宏定义,看如下代码 代码1 /************************************************************************* & ...

  2. 23种设计模式学习一(单列模式)singleton

    单列模式的类(单线程下的) class Singleton { private static Singleton instance; private Singleton() { } public st ...

  3. java、el表达式中保留小数的方法

    Java中: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; p ...

  4. (KEIL)MDK5安装与JLINK问题解决方法(支持代码自动补全)

    MDK V5在10月8日发布,昨天终于没忍住装上使用了一下,尝了尝鲜.   安装和破解的方法相信各位高手都不在话下,实在不会的可以参考keil4的安装步骤,keil5 和 keil4的安装没有的区别. ...

  5. JavaWeb笔记——注册登录系统项目思路

    功能:   > 注册   > 登录 --------------------------------- JSP:   * login.jsp  --> 登录表单   * regist ...

  6. Android java.lang.UnsupportedClassVersionError: com/android/dx/command/Main : Unsupported major.minor ver

    java.lang.UnsupportedClassVersionError: com/android/dx/command/Main : Unsupported major.minor ver 解决 ...

  7. C++时间戳转化(涉及GMT CST时区转化)

    问题由来 时间戳转换(时间戳:自 1970 年1月1日(00:00:00 )至当前时间的总秒数.) #include <stdio.h> #include <time.h> i ...

  8. 整合Struts2+SiteMesh+Spring+MyFaces(JSF)+Freemarker的时候启动服务器报错ClassNotFoundException: org.apache.struts2.sitemesh.FreeMarkerPageFilter

    我一琢磨,难道freemarker与struts2的整合也需要添加一个struts2-freemarker-plugin的jar包? 后来找了半天,确认不需要这个. 然后我就上网搜,这个FreeMar ...

  9. 如何写计算机会议的rebuttal

    其实最好的教材就是实例,恰好NIPS会议会把往年所有论文的Rebuttal都贴出来...,见这里:http://papers.nips.cc/ 同时,圈内同行也总结了不少经验,下面转帖其他人的经验 = ...

  10. !! This tutorial was designed to help you with installation and configuration of OpenCV4Android SDK.

    ref: http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/O4A_SDK.html#running-o ...