栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【图像分割】【Matlab】【论文复现】基于空间信息的模糊c均值聚类算法(sFCM)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【图像分割】【Matlab】【论文复现】基于空间信息的模糊c均值聚类算法(sFCM)

参考文献

[1] Chuang K S, Tzeng H L, Chen S, et al. Fuzzy c-means clustering with spatial information for image segmentation[J]. computerized medical imaging and graphics, 2006, 30(1): 9-15.

概述

模糊c均值聚类(FCM)算法用于图像分割时,由于缺少图像的空间信息,因此对噪声的鲁棒性较差,为此国内外学者提出了许多FCM变体算法。其中主流的方法是通过构造新的目标函数将空间信息添加到原始FCM中,从目前来看,构造目标函数的方法大致分为两类:一是通过滤波算法预处理,接着在处理后的图像上利用数学知识构造新的目标函数,达到提高鲁棒性的目的;二是利用局部信息或正则化运算改变隶属度矩阵,进而达到提高鲁棒性的目的。
本文主要关注的第二种方法,即通过局部运算,改变每次迭代的隶属度值,从而将图像的空间信息引入FCM目标函数之中,提高了算法的鲁棒性。题主根据论文中的公式,复现了这篇论文的代码,从效果来看,该算法的噪声平滑能力较为有限,但 V PC {{text{V}}_{text{PC}}} VPC​和 V PE {{text{V}}_{text{PE}}} VPE​的值却比原始论文的高。

算法实现步骤
  1. 参数设置:包括聚类数目 c l u s t e r _ n u m cluster_{num} cluster_num、模糊因子 m m m、最大迭代次数 m a x _ i t e r max_{iter} max_iter、窗口尺寸 k k k;
  2. 图像灰度转换及其归一化处理;
  3. 添加噪声(可无);
  4. 初始化隶属度矩阵 u i j {{u}_{ij}} uij​;
  5. 更新聚类中心 c i c_{i} ci​,更新公式为 c i = ∑ j = 1 N u i j m x j ∑ j = 1 N u i j m {{c}_{i}}=frac{sumlimits_{j=1}^{N}{u_{ij}^{m}{{x}_{j}}}}{sumlimits_{j=1}^{N}{u_{ij}^{m}}} ci​=j=1∑N​uijm​j=1∑N​uijm​xj​​;
  6. 更新隶属度矩阵 u i j u_{ij} uij​,更新公式为 u i j = 1 ∑ k = 1 c ( ∥ x j − c i ∥ ∥ x j − c k ∥ ) 2 / ( m − 1 )    {{u}_{ij}}=frac{1}{sumlimits_{k=1}^{c}{{{left( frac{left| {{x}_{j}}-{{c}_{i}} right|}{left| {{x}_{j}}-{{c}_{k}} right|} right)}^{{2}/{left( m-1 right)};}}}} uij​=k=1∑c​(∥xj​−ck​∥∥xj​−ci​∥​)2/(m−1)1​;
  7. 计算空间函数 h i j h_{ij} hij​,计算公式为 h i j = ∑ k ∈ N ( x j ) u i k {{h}_{ij}}=sumlimits_{kin Nleft( {{x}_{j}} right)}{{{u}_{ik}}} hij​=k∈N(xj​)∑​uik​;
  8. 计算新的隶属度矩阵 u ′ i j {{{u}'}_{ij}} u′ij​,计算公式为 u ′ i j = u i j p h i j q ∑ k = 1 c u k j p h k j q {{{u}'}_{ij}}=frac{u_{ij}^{p}h_{ij}^{q}}{sumlimits_{k=1}^{c}{u_{kj}^{p}h_{kj}^{q}}} u′ij​=k=1∑c​ukjp​hkjq​uijp​hijq​​;
  9. 计算目标函数 J J J,计算公式为 J = ∑ j = 1 N ∑ i = 1 c u i j m ∥ x j − c i ∥ 2 J=sumlimits_{j=1}^{N}{sumlimits_{i=1}^{c}{u_{ij}^{m}{{left| {{x}_{j}}-{{c}_{i}} right|}^{2}}}} J=j=1∑N​i=1∑c​uijm​∥xj​−ci​∥2;
  10. 判断本次迭代与前一次迭代的目标函数的差值,若小于最小误差则退出迭代,若大于误差则返回步骤5;
  11. 将像素分配给隶属度最大的标签中
楼主原创代码
%% sFCM 论文代码复现
% Title:Fuzzy c-means clustering with spatial information for image segmentation
% Authors:Keh-Shih Chuang Hong-Long Tzeng Sharon Chen Jay Wu Tzong-Jer Chen
% Computerized Medical Imaging and Graphics
% https://doi.org/10.1016/j.compmedimag.2005.10.001
%% 初始化
clc
clear all
close all
%% 参数设置
error=0.001; % 最小误差
cluster_num=3; % 聚类数
max_iter=100; % 最大迭代次数
m=2; % 隶属度指数
k=5; % 窗口大小
%% 读取图像
f_uint8=imread('testimage.jpg');
[row,col,depth]=size(f_uint8);
N=row*col;
%% 彩色图像转换为灰度图像,并归一化到0到1,便于使用imnoise函数加图像噪声
if depth>1
    f=rgb2gray(f_uint8);
    f=double(f)/255;
else
    f=double(f_uint8)/255;
end
%% 加噪声
f = imnoise(f,'gaussian',0,0.01);
figure, imshow(f),title('噪声图像');
f=f*255;
%% 重组原始图像 便于后续处理
f_reorganize=repmat(f,[1 1 cluster_num]);
%% 初始化隶属度矩阵
U=rand(row,col,cluster_num);
U=U./repmat(sum(U,3),[1 1 cluster_num]);
%% 开始聚类
for iter=1:max_iter
    U_m=U.^m;
    % 公式(3),更新聚类中心
    center(:,iter)=sum(sum(f_reorganize.*U_m),2)./(sum(sum(U_m),2));
    % 公式(2)分母部分
    d=(f_reorganize-repmat(permute(center(:,iter),[3 2 1]),[row col 1])).^2;
    % 公式(2)整体,更新旧的隶属度矩阵
    molecular=d.^(1/(m-1));
    U=(molecular.*repmat(sum(1./molecular,3),[1 1 cluster_num])).^(-1);
    U_m=U.^m;
    % 为空间函数 h 分配内存
    h=zeros(row,col,cluster_num);
    % 扩展隶属度矩阵,便于后续的局部信息操作
    U_padded=padarray(U,[k k],'symmetric');
    % 公式(3),计算局部隶属度值
    for i=-k:k
        for j=-k:k
            if i==0 && j==0
                continue;
            end
            h=h+U_padded(i+k+1:end+i-k,j+k+1:end+j-k,:);
        end
    end
    % 公式(4),新的隶属度矩阵
    U=(U_m.*h)./repmat(sum(U_m.*h,3),[1 1 cluster_num]);
    U_m=U.^m;
    % 公式(1),更新目标函数
    J(iter)=sum(sum(sum(U_m.*d)));
    fprintf('第%d次聚类,J=%fn',iter,J(iter));
    %判断迭代停止条件
    if iter>1 && abs(J(iter)-J(iter-1)) 1 && iter == max_iter && abs(J(iter) - J(iter - 1)) > error
        fprintf('目标函数未最小化,提前到达了迭代上限n');
        break;
    end
end
%% 分割结果显示
[~,cluster_indice]=max(U,[],3);
FCM_result=Label_image(f_uint8,cluster_indice);
figure,imshow(FCM_result),title('分割结果');
J=gather(J);
figure,plot(1:iter,J(1:iter)),title('目标函数曲线');
%%
Vpc = sum(sum(sum(U .^ 2))) / N * 100;
Vpe = -sum(sum(sum(U .* log(U)))) / N * 100;
fprintf('Fuzzy partition coefficient Vpc = %.2f%%n', Vpc);
fprintf('Fuzzy partition entropy Vpe = %.2f%%n', Vpe);

运行结果:
原始图像:
分割结果:(噪声类型为高斯噪声)

目标函数曲线:

V PC {{text{V}}_{text{PC}}} VPC​和 V PE {{text{V}}_{text{PE}}} VPE​的值:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/311866.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号