基于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加速处理大尺寸图像。

浙公网安备 33010602011771号