主要内容

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

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

第一步:获取图像

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

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

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

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

你可以在图像中看到六种主要的颜色:背景色、红色、绿色、紫色、黄色和品红。请注意,从视觉上区分这些颜色是多么容易。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(织物,1)size(织物,2)nColors]);count = 1:nColors sample_regions(:,:,count) = roipoly(fabric,region_coordinates(:,1,count),...region_coordinates (:, 2));结束imshow (sample_regions(:: 2))标题(“红色样本区域”

图中包含一个轴对象。标题为Sample Region for Red的axis对象包含一个image类型的对象。

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

Lab_fabric = rgb2lab(fabric);

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

A = lab_fabric(:,:,2);B = lab_fabric(:,:,3);color_markers =零([nColors, 2]);count = 1:nColors color_markers(count,1) = mean2(a(sample_regions(:,:,count)));Color_markers (count,2) = mean2(b(sample_regions(:,:,count)));结束

例如,红色样本区域在'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 = double(A);B = double(B);距离= 0 ([size(a), nColors]);

进行分类

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

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

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

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

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

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

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

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

通过绘制被划分为不同颜色的像素的“a*”和“b*”值,您可以看到最近的邻居分类如何很好地分离不同的颜色种群。为了便于显示,请用颜色标签标记每个点。

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

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

Baidu
map