L*a*b空间中L:亮度层,a:颜色在红绿轴的分量,b:颜色在蓝黄轴的分量。通过计算每个像素点和六种颜色平均值的欧氏距离,这六种距离中最小的距离既为该像素点的颜色,这种方法称为最近邻近法,例如:如果像素点距离红色平均值的欧氏距离最小,那么该像素点就为红色。
基于L*a*b空间的色彩分割的基本步骤如下:
%第一步,读取图片
fabric = imread('caodi.bmp');
figure(1), imshow(fabric), title('fabric');
%第二步,为每种颜色的样本选择一个很小的样本区域,然后计算每个样本区域中这种颜色的平均值。
load regioncoordinates;%下载颜色区域坐标到工作空间
nColors = 6;
sample_regions = false([size(fabric,1) size(fabric,2) nColors]);%初始化每个区域颜色样本存储
for count = 1:nColors
sample_regions(:,:,count) = roipoly(fabric,...
region_coordinates(:,1,count), ...
region_coordinates(:,2,count));%选择每一小块颜色的样本区域
end
subplot(122),
imshow(sample_regions(:,:,2));%显示红色区域的样本
title('sample region for red');
cform = makecform('srgb2lab');%rgb空间转换成L*a*b*空间结构
lab_fabric = applycform(fabric,cform);%rgb空间转换成L*a*b*空间
a = lab_fabric(:,:,2); b = lab_fabric(:,:,3);
color_markers = zeros([nColors, 2]);%初始化颜色均值
for count = 1:nColors
color_markers(count,1)= mean2(a(sample_regions(:,:,count)));%a均值
color_markers(count,2)= mean2(b(sample_regions(:,:,count)));%b均值
end
disp(sprintf('[%0.3f,%0.3f]',color_markers(2,1),...
color_markers(2,2)));%显示红色分量样本的均值
%第三步,使用最近邻规则对每个像素进行分类
%创建一个颜色标签数组
% 0 = background
% 1 = red
% 2 = green
% 3 = purple
% 4 = magenta
% 5 = yellow
color_labels = 0:nColors-1;
a = double(a); b = double(b);
distance = zeros([size(a), nColors]);%初始化距离矩阵
%执行分类
for count = 1:nColors
distance(:,:,count) = ( (a - color_markers(count,1)).^2 + ...
(b - color_markers(count,2)).^2 ).^0.5;%计算到各种颜色的距离
end
%第四步,显示最近邻分类的结果
[value, label] = min(distance,[],3);%求出最小距离的颜色
label = color_labels(label);
clear value distance;
rgb_label = repmat(label,[1 1 3]);
segmented_images = repmat(uint8(0),[size(fabric), nColors]);
for count = 1:nColors
color = fabric;
color(rgb_label ~= color_labels(count)) = 0;%不是标号颜色的像素置0
segmented_images(:,:,:,count) = color;
end
figure;
imshow(segmented_images(:,:,:,1)),%显示背景
title('background'); figure;
imshow(segmented_images(:,:,:,2)), %显示红色目标
title('red objects'); figure;
imshow(segmented_images(:,:,:,3)), %显示绿色目标
title('green objects'); figure,
imshow(segmented_images(:,:,:,4)), %显示紫色目标
title('purple objects'); figure,
imshow(segmented_images(:,:,:,5)), %显示红紫色目标
title('magenta objects'); figure,
imshow(segmented_images(:,:,:,6)), %显示黄色目标
title('yellow objects');
%第五步,显示'a'和'b'标签颜色的值
%您可以通过绘制分为不同颜色的像素的“a”和“b”值来查看最近邻分类的分离程度如何分离不同的颜色群体。 为了显示,用每个点的颜色标签标记每个点。
purple = [119/255 73/255 152/255];
plot_labels = {'k', 'r', 'g', purple, 'm', 'y'};
figure
for count = 1:nColors
plot(a(label==count-1),b(label==count-1),'.','MarkerEdgeColor', ... plot_labels{count}, 'MarkerFaceColor', ...
plot_labels{count});%显示各种颜色的散点图
hold on;
end
title('Scatterplot of the segmented pixels in ''a*b*'' space');
xlabel('''a*'' values'); ylabel('''b*'' values');