基于MATLAB的FCM与K-means图像聚类分割实现

一、K-means算法实现
1. 核心代码
matlab 复制代码
% 读取图像并转换为特征向量
img = imread('peppers.png');
grayImg = rgb2gray(img);
[h, w] = size(grayImg);
pixelData = double(reshape(grayImg, h*w, 1)); % 灰度特征

% K-means参数设置
K = 3; % 聚类数
options = statset('Display', 'final');
[idx, centers] = kmeans(pixelData, K, 'MaxIter', 100, 'Options', options);

% 重构分割图像
segmented = reshape(idx, h, w);
figure;
subplot(121), imshow(img), title('原始图像');
subplot(122), imshow(label2rgb(segmented)), title('K-means分割结果');
2. 优化
  • 特征增强:结合颜色(HSV)与空间坐标(x,y)提升分割连续性:

    matlab 复制代码
    hsvImg = rgb2hsv(img);
    features = [hsvImg(:,:,2), hsvImg(:,:,3), 1/(h*w)]; % 饱和度+纹理+空间权重
  • 初始化优化:使用K-means++提升聚类质量:

    matlab 复制代码
    centers = kmeanspp(pixelData, K); % 自定义K-means++初始化函数

二、FCM算法实现
1. 核心代码
matlab 复制代码
% 读取图像并转换为特征矩阵
img = imread('lena.jpg');
img_gray = rgb2gray(img);
pixelData = double(reshape(img_gray, [], 1)); % 灰度特征

% FCM参数设置
nClusters = 3; % 聚类数
m = 2; % 模糊指数
maxIter = 100; % 最大迭代次数
tolerance = 1e-5; % 收敛阈值

% 初始化隶属度矩阵
U = rand(size(pixelData, 1), nClusters);
U = U ./ sum(U, 2);

% FCM迭代
for iter = 1:maxIter
    % 更新聚类中心
    centers = (U.^m * pixelData) ./ (sum(U.^m, 1) * ones(1, size(pixelData, 2)));
    
    % 更新隶属度矩阵
    dist = pdist2(pixelData, centers);
    U_new = 1 ./ (dist.^(2/(m-1)) .* sum(1 ./ dist.^(2/(m-1)), 2));
    
    % 检查收敛
    if max(abs(U_new(:) - U(:))) < tolerance
        break;
    end
    U = U_new;
end

% 生成分割结果
segmented = reshape(find(U(:,1) == max(U, [], 2)), size(img_gray));
figure;
subplot(121), imshow(img), title('原始图像');
subplot(122), imshow(segmented), title('FCM分割结果');
2. 关键参数说明
  • 模糊指数m :控制隶属度模糊程度,m=2为常用值。

  • 收敛阈值tolerance:值越小精度越高,但计算时间增加。


三、算法对比与适用场景
指标 K-means FCM
计算效率 高(O(nkt)) 低(O(nk^2t))
边界处理 硬边界(锯齿明显) 软边界(过渡平滑)
噪声鲁棒性 较差 较优
适用场景 大规模图像、快速原型 医学影像、复杂纹理分割

四、性能优化
  1. 预处理

    • 灰度化:rgb2gray减少计算量。

    • 去噪:imgaussfilt高斯滤波消除噪声。

  2. 后处理

    • 形态学操作:imerode/imdilate去除小区域。

    • 区域合并:基于邻域连通性优化分割结果。

  3. 多尺度分割

    matlab 复制代码
    % 分块处理(适用于高分辨率图像)
    blockSize = 128;
    [rows, cols] = size(img_gray);
    for i = 1:blockSize:rows
        for j = 1:blockSize:cols
            block = img_gray(i:min(i+blockSize-1,rows), j:min(j+blockSize-1,cols));
            % 对每个块单独聚类
        end
    end

参考代码 用fcm算法和kmeans算法进行聚类分割图像 www.youwenfan.com/contentcsr/100470.html

五、实验结果示例
算法 输入图像 分割结果(K=3) 分割结果(K=5)
K-means image.jpg kmeans3.jpg kmeans5.jpg
FCM image.jpg fcm3.jpg fcm5.jpg

六、常见问题解决
  1. K-means初始中心敏感

    • 使用K-means++初始化提升稳定性。
  2. FCM收敛慢

    • 减少迭代次数maxIter或增大tolerance
  3. 内存不足

    • 对高分辨率图像分块处理,或使用single数据类型。
相关推荐
feifeigo1239 天前
matlab画图工具
开发语言·matlab
Gofarlic_oms19 天前
避免Kisssoft高级分析模块过度采购的科学评估方法
大数据·linux·运维·人工智能·matlab
rit84324999 天前
全变分正则化图像去噪的MATLAB实现
开发语言·matlab
Evand J9 天前
通过matlab实现机器学习的小项目示例(鸢尾花分类)
机器学习·支持向量机·matlab
bu_shuo9 天前
MATLAB命令行窗口中的字体放大操作
matlab·命令行
micro_xx9 天前
Matlab 有限元分析三维悬臂梁变形
前端·数据库·matlab
Matlab程序设计与单片机9 天前
【变压器故障诊断分类与预测(DGA原始数据)】基于标准Elman神经网络
matlab·elman神经网络·变压器故障诊断与分类预测
Evand J9 天前
【课题推荐】深度学习驱动的交通流量预测系统(基于LSTM的交通流量预测系统),MATLAB实现
人工智能·深度学习·matlab·课题简介
晞子的技术札记9 天前
单相Heric并网逆变器工作原理及MATLAB仿真测试
开发语言·matlab
Matlab程序设计与单片机9 天前
【变压器故障诊断分类与预测(三比值法)】基于标准GRNN神经网络
matlab·grnn神经网络·变压器故障诊断与分类·三比值法