基于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数据类型。
相关推荐
ghie90902 小时前
差速转向移动机器人基于速度的动力学模型与自适应控制器 MATLAB实现
开发语言·matlab
t1987512813 小时前
基于Chirp分解和多相快速算法的离散分数傅里叶变换(DFRFT)MATLAB实现
开发语言·算法·matlab
jllllyuz13 小时前
基于MATLAB的PAM通信系统仿真实现
开发语言·matlab
jghhh0115 小时前
LT喷泉码编解码的MATLAB实现
数据库·算法·matlab
Coisinilove19 小时前
MATLAB学习笔记——第三章
笔记·学习·matlab
rit84324991 天前
matlab实现自适应稀疏表示同时完成图像融合与去噪
人工智能·计算机视觉·matlab
ytttr8731 天前
图像配准技术及其Matlab编程实现
开发语言·matlab
hans汉斯1 天前
基于联邦学习的隐私保护和抗投毒攻击方法研究
网络·人工智能·算法·yolo·数据挖掘·聚类·汉斯出版社
yong99901 天前
基于SIFT的MATLAB图像拼接实现
人工智能·计算机视觉·matlab