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

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

步骤1:获取图像

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

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

步骤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]);= roipoly(fabric,region_coordinates(:,1,count),region_coordinates (:, 2));结束imshow (sample_regions(:: 2))标题(“红色样本区域”)

将您的Fabric 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.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);distance = 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);label = color_labels(标签);清除距离;

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

标签矩阵包含织物图像中的每个像素的颜色标签。使用标签矩阵按原始结构图像中的单独对象进行颜色。

Rgb_label = repmat(label,[1 1 3]);segmented_images = 0 ([size(fabric), 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','是'};数字a(label==count-1),b(label==count-1),“。”,'markeredgecolor',plot_labels {},“MarkerFaceColor”,plot_labels {count});抓住;结束标题(“a*b*”空间中分割像素的散点图”);包含(''''''''值');ylabel (“b *”的价值观);