k-means聚类算法的图像分割-matlab实现

k-means聚类算法的图像分割-matlab实现
在这里插入图片描述
以下是基于 MATLAB 的 K-means 聚类算法实现图像分割的完整代码。K-means 是一种常用的无监督学习算法,用于将图像像素分组到不同的聚类中,从而实现图像分割。


功能概述

  1. 输入: 一张彩色图像。
  2. 处理:
    • 将图像从 RGB 空间转换为像素特征向量。
    • 使用 K-means 聚类算法对像素进行分组。
    • 根据聚类结果生成分割后的图像。
  3. 输出: 分割后的图像。

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

功能说明

  1. 加载图像:
    • 用户可以选择一张彩色图像。
  2. 调整聚类数 K:
    • 使用滑块动态调整聚类数(默认值为 3)。
  3. 开始分割:
    • 程序会自动完成 K-means 聚类,并生成分割后的图像。
  4. 显示结果:
    • 在界面上查看原始图像和分割后的图像。

在这里插入图片描述

运行步骤

  1. 打开 GUI 界面,点击“Load Image”按钮选择一张彩色图像。
  2. 使用滑块调整聚类数 K(例如 2、3 或 5)。
  3. 点击“Start Segmentation”按钮,程序会自动完成图像分割。
  4. 在界面上查看分割结果。

注意事项

  1. 聚类数 K 的选择:
    • 较小的 K 值会导致图像过于简化。
    • 较大的 K 值可能会导致过度分割。
  2. 性能优化:
    • 对于高分辨率图像,可以先对图像进行下采样以减少计算量。
  3. 扩展功能:
    • 可以添加保存分割结果的功能。
    • 可以尝试使用其他颜色空间(如 HSV 或 Lab)提升分割效果。

通过上述方法,您可以快速实现基于 K-means 聚类算法的图像分割,并结合 GUI 界面实现良好的用户体验!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值