主要内容

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

这个例子展示了如何通过分析L*a*b*颜色空间来识别织物中的不同颜色。使用图像采集工具箱™获取织物图像。

步骤1:获取图像

读的fabric.png.图像,这是一个彩色织物的图像。而不是使用fabric.png.,您可以使用以下函数在图像采集工具箱中获取图像。

%访问一个附在Pulnix TMC-9700相机上的matrix (R)帧抓取器,并且%使用NTSC格式获取数据。%Vidobj = VideoInput('matrox',1,'m_ntsc_rgb');打开实时预览窗口。把相机对准一块彩色的织物。%预览(vidobj);%捕获一个数据帧。%fabric = getsnapshot(Vidobj);% imwrite(织物、“fabric.png”、“png”);%删除和清除关联的变量。%删除(Vidobj)%clear vidobj;织物= imread ('fabric.png');imshow(织物)标题(“布”

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

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

您可以看到图像中的六种主要颜色:背景颜色,红色,绿色,紫色,黄色和洋红色。请注意您可以轻松地在视觉上彼此区分这些颜色。l * a * b * colorspace(也称为cielab或cie l * 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(结构,区域_coordinates(:,1,count),...region_coordinates (:, 2));结束imshow (sample_regions(:: 2))标题(“红色样本区域”

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

将织物RGB图像转换为L * A * B *图像RGB2LAB.

Lab_Fabric = RGB2LAB(结构);

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

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

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

流('[%0.3f,%0.3f] \ 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(count,2))。^ 2)。^ 0.5;结束[〜,标签] = min(距离,[],3);标签= color_labels(标签);清除距离

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

标签矩阵包含织物图像中的每个像素的颜色标签。使用标签矩阵通过颜色分隔原始结构图像中的对象。

rgb_label = repmat(标签,[1 1 3]);segmented_images = zeros([大小(结构),ncolors],“uint8”);count = 1:ncolors颜色=织物;颜色(rgb_label〜= color_labels(count))= 0;segmented_images(:,::,count)=颜色;结束

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

蒙太奇({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’, 紫色的,'M''是'};数字count = 1:ncolors图(a(label == count-1),b(标签== count-1),“。”'markeredgecolor'...plot_labels {},“MarkerFaceColor”,plot_labels {count});抓住结束标题(“a*b*”空间中分割像素的散点图”);包含(''''''''值');ylabel (“b *”的价值观);

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