一、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)提升分割连续性:
matlabhsvImg = rgb2hsv(img); features = [hsvImg(:,:,2), hsvImg(:,:,3), 1/(h*w)]; % 饱和度+纹理+空间权重 -
初始化优化:使用K-means++提升聚类质量:
matlabcenters = 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)) |
| 边界处理 | 硬边界(锯齿明显) | 软边界(过渡平滑) |
| 噪声鲁棒性 | 较差 | 较优 |
| 适用场景 | 大规模图像、快速原型 | 医学影像、复杂纹理分割 |
四、性能优化
-
预处理:
-
灰度化:
rgb2gray减少计算量。 -
去噪:
imgaussfilt高斯滤波消除噪声。
-
-
后处理:
-
形态学操作:
imerode/imdilate去除小区域。 -
区域合并:基于邻域连通性优化分割结果。
-
-
多尺度分割:
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 |
六、常见问题解决
-
K-means初始中心敏感:
- 使用K-means++初始化提升稳定性。
-
FCM收敛慢:
- 减少迭代次数
maxIter或增大tolerance。
- 减少迭代次数
-
内存不足:
- 对高分辨率图像分块处理,或使用
single数据类型。
- 对高分辨率图像分块处理,或使用