k-means聚类算法的图像分割-matlab实现
以下是基于 MATLAB 的 K-means 聚类算法实现图像分割的完整代码。K-means 是一种常用的无监督学习算法,用于将图像像素分组到不同的聚类中,从而实现图像分割。
功能概述
- 输入: 一张彩色图像。
- 处理:
- 将图像从 RGB 空间转换为像素特征向量。
- 使用 K-means 聚类算法对像素进行分组。
- 根据聚类结果生成分割后的图像。
- 输出: 分割后的图像。
MATLAB 代码
function kmeansImageSegmentation
% 创建 GUI 窗口
figure('Name', 'K-means Image Segmentation', 'NumberTitle', 'off', ...
'Position', [100, 100, 1200, 600], 'MenuBar', 'none', 'ToolBar', 'none');
% 加载图像按钮
uicontrol('Style', 'pushbutton', 'String', 'Load Image', ...
'Position', [20, 550, 100, 30], 'Callback', @loadImage);
% 开始分割按钮
uicontrol('Style', 'pushbutton', 'String', 'Start Segmentation', ...
'Position', [140, 550, 120, 30], 'Callback', @startSegmentation);
% 原始图像显示区域
axes('Position', [0.05, 0.3, 0.3, 0.6]);
title('Original Image');
% 分割结果显示区域
axes('Position', [0.4, 0.3, 0.3, 0.6]);
title('Segmented Image');
% 参数滑块(聚类数 K)
uicontrol('Style', 'text', 'String', 'Number of Clusters (K):', ...
'Position', [850, 550, 150, 20]);
uicontrol('Style', 'slider', 'Min', 2, 'Max', 10, 'Value', 3, ...
'Position', [850, 520, 150, 20], 'Callback', @updateK);
uicontrol('Style', 'text', 'String', 'K = 3', 'Tag', 'KValueText', ...
'Position', [1020, 520, 50, 20]);
% 初始化变量
handles = [];
handles.image = [];
handles.K = 3; % 默认聚类数
guidata(gcf, handles);
% 加载图像回调函数
function loadImage(~, ~)
[file, path] = uigetfile({'*.jpg;*.png', 'Image Files (*.jpg, *.png)'});
if isequal(file, 0)
return;
end
imagePath = fullfile(path, file);
img = imread(imagePath);
handles.image = img;
axes(findobj('Tag', 'OriginalImage'));
imshow(img);
guidata(gcf, handles);
end
% 更新聚类数 K
function updateK(hObject, ~)
K = round(get(hObject, 'Value'));
set(findobj('Tag', 'KValueText'), 'String', sprintf('K = %d', K));
handles.K = K;
guidata(gcf, handles);
end
% 开始分割回调函数
function startSegmentation(~, ~)
if isempty(handles.image)
errordlg('Please load an image first!', 'Error');
return;
end
% 获取参数
K = handles.K;
img = handles.image;
% 图像预处理
[rows, cols, ~] = size(img);
pixelData = double(reshape(img, rows * cols, 3)); % 转换为 N x 3 矩阵
% K-means 聚类
[clusterIdx, clusterCenters] = kmeans(pixelData, K, 'Replicates', 3);
% 生成分割图像
segmentedImg = reshape(clusterIdx, rows, cols); % 聚类索引矩阵
rgbLabel = ind2rgb(segmentedImg, uint8(clusterCenters)); % 转换为 RGB 图像
% 显示分割结果
axes(findobj('Tag', 'SegmentedImage'));
imshow(rgbLabel);
end
end
功能说明
- 加载图像:
- 用户可以选择一张彩色图像。
- 调整聚类数 K:
- 使用滑块动态调整聚类数(默认值为 3)。
- 开始分割:
- 程序会自动完成 K-means 聚类,并生成分割后的图像。
- 显示结果:
- 在界面上查看原始图像和分割后的图像。
—
运行步骤
- 打开 GUI 界面,点击“Load Image”按钮选择一张彩色图像。
- 使用滑块调整聚类数 K(例如 2、3 或 5)。
- 点击“Start Segmentation”按钮,程序会自动完成图像分割。
- 在界面上查看分割结果。
注意事项
- 聚类数 K 的选择:
- 较小的 K 值会导致图像过于简化。
- 较大的 K 值可能会导致过度分割。
- 性能优化:
- 对于高分辨率图像,可以先对图像进行下采样以减少计算量。
- 扩展功能:
- 可以添加保存分割结果的功能。
- 可以尝试使用其他颜色空间(如 HSV 或 Lab)提升分割效果。
通过上述方法,您可以快速实现基于 K-means 聚类算法的图像分割,并结合 GUI 界面实现良好的用户体验!