主要内容

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

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

步骤1:获取图像

读的fabric.png形象,这是一个丰富多彩的织物的形象。而不是使用fabric.png使用以下功能,您可以获得一个图像在图像采集工具。

%访问Matrox (R)抓帧器附加到Pulnix tmc - 9700相机%获得数据使用NTSC格式。% vidobj = videoinput (matrox, 1, ' M_NTSC_RGB ');%打开一个预览窗口。点相机到一块五颜六色的织物。%预览(vidobj);%获取一帧的数据。%织物= getsnapshot (vidobj);% imwrite(织物、“fabric.png”、“png”);%删除和明确的相关变量。%删除(vidobj)%清楚vidobj;织物= imread (“fabric.png”);imshow(织物)标题(“布”)

图包含一个坐标轴对象。坐标轴对象与标题结构包含一个类型的对象的形象。

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

你可以看到六大图像中颜色:背景颜色,红色,绿色,紫色,黄色,红色。注意很容易你可以视觉上区分这些颜色。L * a * b *色彩(也称为CIELAB或CIE L * a * b *)使您能够量化这些视觉差异。

L * a * b *彩色空间来源于CIE XYZ三色值。L * a * b *空间由一个亮度L *或亮度层,色度层“*”表示颜色瀑布沿着红绿轴,和色度层b *的瀑布沿着自民党轴指示的颜色。

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

简化这个例子中,加载存储在MAT-file区域坐标。

负载regioncoordinates;nColors = 6;sample_regions = false([大小(面料,1)大小(面料,2)nColors]);数= 1:nColors sample_regions(:,:,数)= roipoly(织物、region_coordinates(:, 1日计算),region_coordinates (:, 2));结束imshow (sample_regions(:: 2))标题(“红色的样区”)

图包含一个坐标轴对象。红色的坐标轴对象与标题样区包含一个类型的对象的形象。

你的织物RGB图像转换成L * a * b *图像使用rgb2lab

lab_fabric = rgb2lab(织物);

计算的意思是‘*’和‘b *’值的每个区域提取roipoly。这些值作为你的颜色标记“* b *”空间。

一个= lab_fabric (:: 2);b = lab_fabric (:: 3);color_markers = 0 ([nColors 2]);数= 1:nColors color_markers(计数,1)=非常刻薄的((sample_regions (:,:,)));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:每个像素使用最近邻规则进行分类

每种颜色标记有一个“*”和“b *”值。你可以分类中的每个像素lab_fabric通过计算图像之间的欧氏距离,像素和每种颜色标记。最小的距离会告诉你,颜色标记的像素最匹配。例如,如果一个像素之间的距离和红色标记是最小的,然后像素将被贴上红色的像素。

创建一个数组,其中包含你的颜色标签,即。,0 = background, 1 = red, 2 = green, 3 = purple, 4 = magenta, and 5 = yellow.

color_labels = 0: nColors-1;

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

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

进行分类

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

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

矩阵的标签包含一个标签织物图像每个像素的颜色。使用标签矩阵分离对象在原始织物图像的颜色。

rgb_label = repmat(标签,[1 1 3]);segmented_images = 0([大小(织物),nColors],“uint8”);数= 1:nColors颜色=织物;颜色(rgb_label ~ = color_labels(计数))= 0;segmented_images(:,:,:,数)=颜色;结束

显示五个分段色彩蒙太奇。也显示图像中的背景像素不归类为一种颜色。

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

图包含一个坐标轴对象。坐标轴对象标题蒙太奇的红色,绿色,紫色,红色,和黄色的对象和背景包含一个类型的对象的形象。

第五步:显示“*”和“b *’的标签的颜色值

你可以看到最近邻分类分开不同的颜色数量通过策划“*”和“b *’分为单独的像素的颜色值。标签显示的目的,每个点与它的颜色标签。

紫色= (119/255 73/255 152/255);plot_labels = {“k”,“r”,‘g’、紫色、“米”,“y”};图数= 1:nColors情节((标签= =把1)、b(标签= =把1),“。”,“MarkerEdgeColor”,plot_labels {},“MarkerFaceColor”,plot_labels{数});持有;结束标题(散点图的分割在“a * b *”空间像素的);包含(“*”价值观);ylabel (“b *”的价值观);

图包含一个坐标轴对象。标题散点图的坐标轴对象分割像素在a * *的空间中,包含“*”价值观,ylabel b *的值包含6行类型的对象。一个或多个行显示的值只使用标记