基于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数据类型。
相关推荐
L-影1 小时前
为什么你的数据里藏着“隐形圈子”?聊聊AI中的聚类
人工智能·ai·数据挖掘·聚类
春日见7 小时前
E2E自驾规控30讲:环境搭建
开发语言·驱动开发·matlab·docker·计算机外设
皮蛋瘦肉熬不成粥7 小时前
MES(The Measures of Effect Size )工具箱的使用
matlab·概率论
yang_upup1 天前
Matlab里simulink的元器件介绍
开发语言·matlab
机器学习之心1 天前
【信道估计】面向6G的星地融合NTN系统信道估计与多普勒补偿研究附MATLAB代码
matlab·信道估计·多普勒补偿
hoiii1871 天前
Mean Shift目标跟踪算法MATLAB实现
算法·matlab·目标跟踪
88号技师1 天前
2026年3月中科院一区SCI-赏金猎人优化算法Bounty Hunter Optimizer-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
yong99901 天前
动态四足机器人的自由模型预测控制(FMPC)MATLAB实现
算法·matlab·机器人
88号技师1 天前
2026年3月新锐一区SCI-傅里叶变换优化算法Fourier transform optimizer-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
我爱C编程1 天前
基于火星-地球深空通信系统的太空图像传输链路matlab性能仿真
matlab·火星-地球·深空通信·太空图像传输