基于颜色的分割使用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 *”的价值观);