主要内容

基于颜色的分割使用L*a*b*颜色空间

这个例子展示了如何通过分析L*a*b*颜色空间来识别织物中的不同颜色。

步骤1:获取图像

读的fabric.png图像,这是一个彩色织物的图像。

织物= imread (“fabric.png”);imshow(织物)标题(“布”

图中包含一个坐标轴。标题为Fabric的轴包含一个类型为image的对象。

步骤2:在L*a*b*颜色空间中计算每个区域的样本颜色

你可以在图片中看到六种主要的颜色:背景色、红、绿、紫、黄和品红。注意你是多么容易从视觉上区分这些颜色。L*a*b*色彩空间(也称为CIELAB或CIEL *a*b*)使您能够量化这些视觉差异。

颜色空间L*a*b*由CIE XYZ三刺激值导出。L*a*b*空间由光度“L*”或亮度层、色度层“a*”表示颜色沿红绿轴的位置,以及色度层“b*”表示颜色沿蓝黄轴的位置。

您的方法是为每种颜色选择一个小的样本区域,并在“a*b*”空间中计算每个样本区域的平均颜色。您将使用这些颜色标记对每个像素进行分类。

为了简化这个示例,请加载存储在mat文件中的区域坐标。

负载regioncoordinates;nColors = 6;sample_regions = false([size(fabric,1) size(fabric,2) nColors]);count = 1:nColors sample_regions(:,:,count) = roipoly(fabric,region_coordinates(:,1,count),...region_coordinates (:, 2));结束imshow (sample_regions(:: 2))标题(“红色样本区域”

图中包含一个坐标轴。标题为“红色样本区域”的轴包含一个类型为image的对象。

将织物RGB图像转换为L*a*b*图像使用rgb2lab

lab_fabric = rgb2lab(织物);

计算每个提取区域的平均值“a*”和“b*”值roipoly.这些值作为“a*b*”空间中的颜色标记。

一个= lab_fabric (:: 2);b = lab_fabric (:: 3);color_markers = 0 ([nColors, 2]);count = 1:nColors color_markers(count,1) = mean2(a(sample_regions(:,:,count)));color_markers(统计,2)=非常刻薄的(b (sample_regions (:,:,)));结束

例如,“a*b*”空间中的红色样本区域的平均颜色为

流(“[% 0.3 f, % 0.3 f] \ n”, color_markers (2, 1), color_markers (2, 2));
[69.828, 20.106]

步骤3:使用最近邻规则对每个像素进行分类

每个颜色标记现在有一个'a*'和一个'b*'值。你可以对每个像素进行分类lab_fabric通过计算像素和每个颜色标记之间的欧几里得距离。最小的距离将告诉你像素最接近的颜色标记。例如,如果一个像素与红色标记之间的距离最小,那么该像素将被标记为红色像素。

创建一个包含颜色标签的数组,例如,0 =背景,1 =红色,2 =绿色,3 =紫色,4 =品红,5 =黄色。

color_labels = 0: nColors-1;

初始化在最近邻分类中使用的矩阵。

一个=双(a);b =双(b);距离= 0 ([size(a), nColors]);

进行分类

count = 1:nColors distance(:,:,count) = ((a - color_markers(count,1)))。^ 2 +...(b - color_markers(统计,2))。^ 2)。^ 0.5;结束[~,标签]= min(距离,[],3);标签= color_labels(标签);清晰的距离

步骤4:显示最近邻分类结果

标签矩阵包含织物图像中每个像素的颜色标签。使用标签矩阵按颜色分离原始织物图像中的物体。

Rgb_label = repmat(label,[1 1 3]);segmented_images = zero ([size(fabric), nColors],“uint8”);count = 1:nColors color = fabric;Color (rgb_label ~= color_labels(count)) = 0;segmented_images(:,:,:,数)=颜色;结束

显示五个分割的颜色作为蒙太奇。还显示图像中未分类为颜色的背景像素。

蒙太奇({segmented_images (:,:,: 2), segmented_images (:,:,: 3)...segmented_images (::: 4), segmented_images (:,:,: 5)...segmented_images (::,:, 6), segmented_images (:,:,: 1)});标题(红色、绿色、紫色、品红、黄色物体和背景的蒙太奇

图中包含一个坐标轴。标题为“红色、绿色、紫色、品红和黄色对象蒙太奇”和“背景”的轴包含一个类型为图像的对象。

步骤5:显示标签颜色的“a*”和“b*”值

通过绘制被分类为不同颜色的像素的“a*”和“b*”值,您可以看到最近邻分类将不同颜色种群分离得多么好。为了显示的目的,给每个点贴上它的颜色标签。

紫色= [119/255 73/255 152/255];plot_labels = {“k”“r”‘g’、紫色、“米”“y”};数字nColors plot(a(label==count-1),b(label==count-1)),“。”“MarkerEdgeColor”...plot_labels {},“MarkerFaceColor”, plot_labels{数});持有结束标题(“a*b*”空间中分割像素的散点图”);包含(“*”价值观);ylabel (“b *”的价值观);

图中包含一个坐标轴。在“a*b*”空间中分割像素的标题为Scatterplot的轴包含6个类型为line的对象。