MATLAB图像处理:72:使用 Lab 颜色空间的基于颜色的分割 您所在的位置:网站首页 matlab分离点 MATLAB图像处理:72:使用 Lab 颜色空间的基于颜色的分割

MATLAB图像处理:72:使用 Lab 颜色空间的基于颜色的分割

2023-05-03 03:56| 来源: 网络整理| 查看: 265

本示例说明如何通过分析 Lab 颜色空间来识别织物中的不同颜色。

第 1 步:获取图像

读入fabric.png图像,这是一幅彩色织物的图像。

fabric = imread('fabric.png'); imshow(fabric) title('Fabric')步骤 2:计算每个区域在 Lab 颜色空间中的样本颜色

您可以在图像中看到六种主要颜色:背景色、红色、绿色、紫色、黄色和洋红色。请注意,您可以在视觉上轻松区分这些颜色。Lab 色彩空间(也称为 CIELAB 或 CIE Lab)使您能够量化这些视觉差异。

Lab 颜色空间源自 CIE XYZ 三色值。Lab空间由亮度L、色度a组成(表示颜色沿红绿轴下降的位置)、色度层b(表示颜色沿蓝黄轴下降的位置)。

我们的方法是为每种颜色选择一个小样本区域,并在ab空间中计算每个样本区域的平均颜色。您将使用这些颜色标记对每个像素进行分类。

为了简化此示例,请加载存储在 MAT 文件中的区域坐标。

load regioncoordinates; ​ nColors = 6; sample_regions = false([size(fabric,1) size(fabric,2) nColors]); ​ for count = 1:nColors sample_regions(:,:,count) = roipoly(fabric,region_coordinates(:,1,count), ... region_coordinates(:,2,count)); end ​ imshow(sample_regions(:,:,2)) title('Sample Region for Red')

使用rgb2lab函数, 将织物 RGB 图像转换为 Lab图像。

lab_fabric = rgb2lab(fabric);

计算您使用roipoly提取的每个区域的平均a和b值。这些值用作ab空间中的颜色标记。

a = lab_fabric(:,:,2); b = lab_fabric(:,:,3); color_markers = zeros([nColors, 2]); ​ for count = 1:nColors color_markers(count,1) = mean2(a(sample_regions(:,:,count))); color_markers(count,2) = mean2(b(sample_regions(:,:,count))); end

例如,ab空间中红色样本区域的平均颜色为

fprintf('[%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 = double(a); b = double(b); distance = zeros([size(a), nColors]);

执行分类。

for count = 1:nColors distance(:,:,count) = ( (a - color_markers(count,1)).^2 + ... (b - color_markers(count,2)).^2 ).^0.5; end ​ [~,label] = min(distance,[],3); label = color_labels(label); clear distance;步骤 4:显示最近邻分类的结果

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

rgb_label = repmat(label,[1 1 3]); segmented_images = zeros([size(fabric), nColors],'uint8'); ​ for count = 1:nColors color = fabric; color(rgb_label ~= color_labels(count)) = 0; segmented_images(:,:,:,count) = color; end

将五种分类颜色显示为并列对比的图像。还显示图像中未分类为颜色的背景像素。

montage({segmented_images(:,:,:,2),segmented_images(:,:,:,3) ... segmented_images(:,:,:,4),segmented_images(:,:,:,5) ... segmented_images(:,:,:,6),segmented_images(:,:,:,1)}); title("Montage of Red, Green, Purple, Magenta, and Yellow Objects, and Background")步骤 5:显示标记颜色的a和b值

您可以通过绘制被分类为不同颜色的像素的a和b值来查看最近邻分类对不同颜色群体的分离程度。出于显示目的,用颜色标签标记每个点。

purple = [119/255 73/255 152/255]; plot_labels = {'k', 'r', 'g', purple, 'm', 'y'}; ​ figure for count = 1:nColors plot(a(label==count-1),b(label==count-1),'.','MarkerEdgeColor', ... plot_labels{count}, 'MarkerFaceColor', plot_labels{count}); hold on; end title('Scatterplot of the segmented pixels in ''a*b*'' space'); xlabel('''a*'' values'); ylabel('''b*'' values');

注:本文根据MATLAB官网内容修改而成。

以下的免费视频教程,特点是没有PPT,不掺水,直接编程环境下的实操课程:

用100分钟查看免费的《MATLAB编程》视频课程 1data.pro

欢迎您进一步了解以下MATLAB系列文章:

吃小羊:MATLAB作图实例:00:索引吃小羊:MATLAB金融工具箱:00:索引吃小羊:MATLAB图像处理:00:索引



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有