摘要:

  基于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. CLIP PATH (MASK) GENERATOR是一款在线制作生成clip-path路径的工具,可以直接生成SVG代码以及配合Mask制作蒙板。

    CLIP PATH (MASK) GENERATOR是一款在线制作生成clip-path路径的工具,可以直接生成SVG代码以及配合Mask制作蒙板. CLIP PATH (MASK) GENERATO ...

  2. POJ 1870 Bee Breeding(找规律)

    题目链接 题意 : 给你一个蜂巢状图形,让你找出两个点之间的距离. 思路 : 在做这个题之前可以看一下2265,因为是一种题来着,规律就是我在2265里写的那样,然后就是求距离了,求距离的时候只需考虑 ...

  3. ECharts案例教程1

    原文:http://blog.csdn.net/whqet/article/details/42703973 简介 ECharts,缩写来自Enterprise Charts,商业级数据图表,是百度的 ...

  4. 8 Types Of Friends You Need To Have in Your Life

    8 Types Of Friends You Need To Have in Your Life一生中应该有的8种类型的朋友Did you know that people without frien ...

  5. Arraylist和Vector的区别与HashMap和Hashtable的区别

    1.ArrayList和HashMap都是线程异步的,所以它们的特点是效率高,但是安全性低: 2.Vector和Hashtable都是线程同步的,所以它们的特点是效率低,但是安全性高.

  6. 谈谈三层架构中Model的作用

    Model又叫实体类,这个东西,大家可能觉得不好分层.包括我以前在内,是这样理解的:UI<-->Model<-->BLL<-->Model<-->DAL ...

  7. Java-J2SE学习笔记-树状展现文件结构

    1.利用java.io相关类树状展现文件结构 2.判定给定路径是否为dir,是则递归,每一递归一层缩进一次 3.代码 package Test; import java.io.File; public ...

  8. C++虚函数的缺陷

    MFC中的消息机制没有采用C++中的虚函数机制,原因是消息太多,虚函数内存开销太大.在Qt中也没有采用C++中的虚函数机制,原因与此相同,其实这里还有更深层次上的原因,大体说来,多态的底层实现机制只有 ...

  9. VCL设计方法概论(自己总结了9条),以及10个值得研究的控件 good

    VCL设计方法概论 1. 把Delphi对象改造成一个Windows窗口,主要是要设置Handle和回调函数.在创建一个Windows窗口后,将其句柄赋值给Delphi对象的属性,这个并不难,相当于从 ...

  10. 【原创】如何在Android中为TextView动态设置drawableLeft等

    如何在Android中为TextView动态设置drawableLeft等   两种方式:   方式1:手动设置固有边界 Drawable drawable = getResources().getD ...