摘要:

  基于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. 【leetcode】Contains Duplicate & Rectangle Area(easy)

    Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your funct ...

  2. POJ 1547

    #include<iostream> #include<string> using namespace std; int main() { int length; int hi ...

  3. Activity学习(五)——Bundle机制

    上一篇文章我简单介绍了Activity之间简单切换,很简单,这一篇文章我们继续聊Android中程序页面互相跳转的Activity,不过这一次我们在Activity跳转时,携带一些简单的数据,然后在新 ...

  4. (转)OpenCV 2.4.8 +VS2010的开发环境配置

    转自:  http://blog.csdn.net/poem_qianmo/article/details/19809337 自己可能需要再进行修改 本系列文章由zhmxy555(毛星云)编写,转载请 ...

  5. (2)在vs2010上配置opengl

    参考自http://www.yakergong.net/nehe/ 在Visual Studio 2003 中创建基于Nehe SDK的应用程序分为以下几个步骤: 创建一个空白的工程文件 包含Nehe ...

  6. Codeforces Round #335 (Div. 2) D. Lazy Student 贪心

    D. Lazy Student   Student Vladislav came to his programming exam completely unprepared as usual. He ...

  7. socket传输过程

    连接过程: 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认. (1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处 ...

  8. 使用secureCRT远程Linux,出现远程主机拒绝连接

    1.查看是否开启远程连接, 控制面板->程序和功能->打开或关闭windows功能->勾选telnet服务器和telnet客户端2.cmd命令行输入telnet ip地址 端口号(比 ...

  9. 如何用crontab运行一个图形化界面的程序

    crontab是linux中定时任务的 执行crontab -e可以编辑定时列表(export DISPLAY=:0 指定显示器或者export DISPLAY=localhost:0) 15 13 ...

  10. module.xml 快捷代码

    以下内容为淘宝装修模块描述文件(module.xml)快捷代码块,可以快速调整模块信息,详解请查阅>> http://open.taobao.com/doc/detail.htm?id=1 ...