基于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数据类型。
相关推荐
2zcode5 小时前
运动模糊图像复原的MATLAB仿真与优化
开发语言·matlab
yong99909 小时前
MATLAB读取高光谱图像
开发语言·matlab
2zcode9 小时前
基于MATLAB的肝病风险评估与分期分析系统设计与实现
开发语言·matlab
简简单单做算法18 小时前
基于GAN生成对抗网络模型的图像生成与虚拟场景构建系统matlab仿真
人工智能·神经网络·生成对抗网络·matlab·gan·虚拟场景构建
Evand J18 小时前
【编队控制例程】(2)基于UWB的多无人机协同定位与编队控制仿真,基于UKF(无迹卡尔曼滤波)定位。附MATLAB代码下载链接
matlab·无人机·控制·ukf
2zcode19 小时前
基于MATLAB与SVM实现河道水面漂浮物的自动检测与识别
人工智能·支持向量机·matlab
破阵子4432819 小时前
如何用 Claude Code 等 Agent 工具操作 MATLAB(支持代码编写及 Simulink)
开发语言·matlab
寡人很佛1 天前
【day16】从零开始学数学建模-日期使用方法汇总
数学建模·matlab·datetime·日期处理·datenum
gihigo19981 天前
基于MATLAB的LTE物理层仿真系统
开发语言·matlab
机器学习之心HML1 天前
粒子群算法求解速冻食品冷链配送路径优化问题,MATLAB代码
算法·matlab·冷链配送路径优化