Advertisement

实验五 基于K-means与FCM的图像分割方法

阅读量:

实验五 基于K-means与FCM的图像分割方法

实验目的

加深对K-means和FCM模糊聚类方法的理解,并掌握基于K-Means与FCM模糊聚类的使用方法。

实验条件

MATLAB,PC机

实验原理

模糊C均值聚类(Fuzzy C-means,FCM)算法,模糊C均值聚类(Fuzzy C-means)算法简称FCM算法,是软聚类方法的一种。FCM算法最早由Dunn在1974年的期刊“Journal of Cybernetics”文献中提出,文献为“A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters”,然后在1984年经 Bezdek于“Computers & Geosciences”推广,原始文献为“FCM: The fuzzy c-means clustering algorithm”。硬聚类算法在分类时有一个硬性标准,根据该标准进行划分,分类结果非此即彼。软聚类算法更看重隶属度 ,隶属度在[0,1]之间,每个对象都有属于每个类的隶属度,并且所有隶属度之和为 1,即更接近于哪一方,隶属度越高,其相似度越高。
模糊C-均值聚类(FCM)算法─种软聚类的聚类方法,该方法的思想使用隶属度来表示每个数据之间的关系,从而确定每个数据点属于的聚类簇的聚类方法。同时FCM算法也是一种基于目标函数的算法,给定含有n个数据的数据集:X={x_1,x_2...,x_i,...,x_n }X_i是第i个特征向量,X_{ij}X_i的第j个属性。每个样本包含d个属性。FCM算法可以将该数据集划分为K类,K为大于1的正整数,其中K个类的聚类中心分别为[v_1, v_2,.. . , v_n]
FCM的目标函数和约束条件如下:
J(U,V) = \sum\limits_{i = 1}^n {\sum\limits_{j = 1}^{\rm{k}} {u_{ij}^md_{ij}^2} } ,\sum\limits_{j = 1}^k {{u_{ij}}} = 1,{u_{ij}} \in [0,1]
其中,u_ij是样本点x_i;与聚类中心v_j;的隶属度,m是模糊指数(m>1),d_ij是样本点x_i与聚类中心v_j,的距离,一般采用欧氏距离。聚类即是求目标函数在约束条件的最小值。FCM算法通过对目标函数的迭代优化来取得对样本集的模糊分类。
为使目标函数J取得最小值,在满足约束条件的情况下对目标函数使用拉格朗日(Lagrange)乘数法,得到隶属度矩阵U和聚类中心v_j

{u_{ij}} = \frac{1}{{\sum\limits_{c - 1}^k {{{(\frac{{{d_{ij}}}}{{{d_{ik}}}})}^{\frac{2}{{m - 1}}}}} }},{v_j} = \frac{{\sum\limits_{i = 1}^n {u_{ij}^m{x_i}} }}{{\sum\limits_{i = 1}^n {u_{ij}^m} }}

算法步骤
img

图1 算法流程图

实验代码

复制代码
    function [idx,C] = my_kmeans(X,k)
    % 输入:X为数据,k为分类数
    % 输出:idx为类的索引,C为聚类好的聚类中心
    % matlab自带kmeans函数,调用格式为"[idx,C] = kmeans(X,k)",
    %% 原理推导Kmeans聚类算法
    [m,n]=size(X);
    C=X(randperm(m,k),:);%从m个点中随机选择cluster_num个点作为初始聚类中心点
    iter_max=100;%最大次数
    d_C = 1e-5; %中心变化阈值
    iter=0;
    distance1 = zeros(k,m);
    cluster_new = zeros(k,n);
    while(iter<iter_max)
    % distance1存储每个点到各聚类中心的欧氏距离
    for i=1:k
        distance=(X-C(i,:)).^2;% 
        distance1(i,:)=sqrt(sum(distance')); % sqrt(x^2 + y^2),distance1是50行i列的
    end
    [~,idx]=min(distance1);%index_cluster取值范围1~cluster_num,~是最小元素的值,用不到,故省略
    % cluster_new存储新的聚类中心
    for j=1:k
        cluster_new(j,:)=mean(X(idx==j,:));
    end
    %如果新的聚类中心和上一轮的聚类中心距离和大于therad_lim,更新聚类中心,否则算法结束
    if (sum(sqrt(sum(((cluster_new-C).^2)')))>d_C)
        C=cluster_new;
    else
        break; 
    end
    iter = iter+1;
    end
    fprintf('迭代次数:%d\n',iter)
    idx = idx';%为了和MATLAB自带算法输出维度一样
    end
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
复制代码
    function [center,U] = my_fcm(data,Nc)
    % 输入:data为数据,Nc为分类数
    % 输出:centers为聚类好的聚类中心,U为隶属度矩阵
    % matlab自带fcm函数,调用格式为"[centers,U] = fcm(data,Nc)",
    %%
    max_iter = 100;%迭代次数
    m = 2;%指数
    n = size(data,1);%样本个数
    %--初始化隶属度u,条件是每一列和为1
    U = rand(Nc,n);
    col_sum = sum(U);
    U = U./col_sum(ones(Nc,1),:);
    % d_U = 1e-5;         % 隶属度变化阈值
    d_C = 1e-5;         % 类中心变化阈值
    iter = 0;
    mf = U.^m;
    center = mf*data./((ones(size(data, 2), 1)*sum(mf'))');  
    while iter < max_iter
    
    dist = distfcm(center, data);        % 计算距离矩阵
    tmp = dist.^(-2);
    U_new = tmp./(ones(Nc, 1)*sum(tmp));	% 新的隶属度矩阵
    mf = U_new.^2;                              % 隶属度矩阵进行指数运算
    center_new = mf*data./((ones(size(data, 2), 1)*sum(mf'))'); % 新聚类中心
    
    %     err_U = U - U_new;
    err_C = center - center_new;
    
    %     if(max(abs(err_C(:))) < d_C || max(abs(err_U(:))) < d_U)
    if(max(abs(err_C(:))) < d_C )
        break;
    end
    U = U_new;
    center = center_new;
    iter = iter+1;
    end
    fprintf('迭代次数:%d\n',iter)
    end
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
复制代码
    clear;clc;close all;
    %% 图像导入和预处理
    data_original = imread('002.png');
    figure; imshow(data_original);
    title('原始图像')
    if (size(data_original,3)>2)
    data_original = rgb2gray(data_original);
    end
    %将图像转换为双精度值
    img = im2double(data_original);
    %通过应用中值滤波器去除噪声
    img=medfilt2(img);
    figure; imshow(img);
    title('去噪后的图像')
    
    %% 用FCM算法分割
    %将图像转换为线性形状
    data = reshape(img,[],1);
    
    Nc = 4;%聚类数
    
    %使用FCM或AFKM
    [center,U] = my_fcm(data,Nc);%[center,U] = fcm(data,Nc);自编函数和自带函数都能用
    [maxU,idx] = max(U);
    %聚类后的图
    im_res = reshape(center(idx),size(img));
    figure;imshow(im_res);
    title('聚类后的图')
    %聚类后的图(一种颜色代表一类)
    img_res = reshape(idx,size(img)); 
    figure;imagesc(img_res)
    title('聚类后的彩图')
    
    %分割后的图,这里是4类,所以是四张图
    figure
    subplot(2,2,1),imshow(img_res==1,[]);
    subplot(2,2,2),imshow(img_res==2,[]);
    subplot(2,2,3),imshow(img_res==3,[]);
    subplot(2,2,4),imshow(img_res==4,[]);
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
在这里插入图片描述

图1 实验测试图1

复制代码
    close all; clear; clc;
    
    % 读取图像
    image = imread('002.png');
    
    % 转换为特征向量,
    data = double(reshape(image, [], 3));
    
    % 设置参数
    num_clusters = 5;  % 聚类数量
    m = 2;  % 模糊因子
    max_iter = 100;  % 最大迭代次数
    threshold = 1e-4;  % 停止阈值
    
    % 执行模糊C均值聚类
    [centers, U, ~] = fcm(data, num_clusters, [m max_iter threshold NaN]);
    
    % 获取每个数据点的类标签
    [~, labels] = max(U, [], 1);  
    
    % 将聚类结果重构为图像
    segmented_image = reshape(centers(labels, :), size(image));
    
    % 显示原始图像和分割结果
    subplot(1, 2, 1);
    imshow(image);
    title('Original Image');
    subplot(1, 2, 2);
    imshow(uint8(segmented_image));
    title('Segmented Image');
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
在这里插入图片描述

图2 实验测试图

全部评论 (0)

还没有任何评论哟~