基于MATLAB的颜色图像分割实现

一、核心代码实现(基于LAB颜色空间与K-means聚类)

function color_segmentation_demo()
    % 读取图像
    img = imread('peppers.png');
    figure;
    imshow(img);
    title('原始图像');
    
    % 转换到LAB颜色空间
    lab_img = rgb2lab(img);
    a = lab_img(:,:,2);
    b = lab_img(:,:,3);
    
    % 数据预处理
    ab = [a(:), b(:)];
    ab = zscore(ab); % 标准化处理
    
    % K-means聚类(设置3个颜色区域)
    num_clusters = 3;
    [idx, centers] = kmeans(ab, num_clusters, 'MaxIter', 1000);
    
    % 重构分割结果
    segmented = reshape(idx, size(a));
    figure;
    imshow(label2rgb(segmented));
    title('K-means颜色分割结果');
    
    % 显示聚类中心颜色
    figure;
    hold on;
    for i = 1:num_clusters
        plot(centers(i,1), centers(i,2), 'ko', 'MarkerSize', 10, 'LineWidth', 2);
    end
    hold off;
    title('聚类中心颜色分布');
    xlabel('a*分量');
    ylabel('b*分量');
end

二、关键参数说明

参数 作用范围 推荐值 调优方法
num_clusters 聚类数量 3-8 肘部法则确定最佳聚类数
标准化方法 数据预处理 Z-score 避免不同通道量纲差异影响聚类
初始中心选择 K-means算法 k-means++ 提升聚类收敛速度

三、进阶功能实现

1. 交互式颜色范围调整(滑动条控制)

function interactive_segmentation()
    % 读取图像
    img = imread('peppers.png');
    hsv_img = rgb2hsv(img);
    
    % 创建GUI界面
    fig = uifigure('Name','颜色范围调整');
    ax = uiaxes(fig);
    imshow(img, 'Parent', ax);
    
    % 创建滑动条
    h_slider = uislider(fig, 'Position',[20 20 200 5], ...
        'ValueChangedFcn', @(src,event) update_mask(src,event,img));
    
    % 初始显示
    update_mask(h_slider, [], img);
end

function update_mask(slider, event, img)
    % 获取当前阈值
    threshold = slider.Value;
    
    % 创建掩码
    hsv = rgb2hsv(img);
    mask = hsv(:,:,1) > threshold;
    
    % 显示结果
    imshow(mask, 'Parent', sldparent);
end

2. 多尺度颜色分割

function multi_scale_segmentation(img, scales)
    % 多尺度处理
    results = cell(1,length(scales));
    for i = 1:length(scales)
        scaled_img = imresize(img, scales(i));
        lab_img = rgb2lab(scaled_img);
        ab = lab_img(:,:,2:3);
        [~, centers] = kmeans(ab(:,:), 3);
        mask = kmeans_segmentation(scaled_img, centers);
        results{i} = imresize(mask, size(img));
    end
    
    % 合并多尺度结果
    final_mask = mode(results, 3);
    imshow(final_mask);
end

参考代码 基于颜色的图像分割程序 www.youwenfan.com/contentcnl/78997.html

四、典型应用场景

1. 水果分拣系统

% 苹果红色区域提取
img = imread('apple.jpg');
lab_img = rgb2lab(img);
mask = (lab_img(:,:,1) > 85) & (lab_img(:,:,1) < 95);
clean_mask = morphological_refine(mask);

2. 工业质检

% 塑料件表面缺陷检测
img = imread('plastic.jpg');
[hsv, ~] = rgb2hsv(img);
mask = hsv(:,:,1) > 0.8; % 提取高饱和区域
edges = edge(mask, 'Canny');

该方法通过颜色空间转换和聚类算法实现精准分割,实际应用中建议结合形态学处理提升鲁棒性,并通过GPU加速处理大尺寸图像。

posted @ 2025-11-14 10:47  kiyte  阅读(9)  评论(0)    收藏  举报