Matlab 基于l*a*b的颜色分割

Matlab 基于l*a*b的颜色分割,matlab,image-processing,colors,segment,Matlab,Image Processing,Colors,Segment,我正在使用MatLab网站上的代码,“使用Lab*颜色空间的基于颜色的分割”: 所以我尝试自己选择一些区域,而不是使用“加载区域坐标”,使用roipoly(织物),但我被卡住了。如何保存刚绘制的多边形的坐标?事实上,我是按照lennon310在解决方案II,页面底部的建议来做的: 我不确定什么时候保存区域坐标和执行大小(区域坐标,1) 我做了以下更改(步骤1): 1) 删除“加载区域坐标” 2) 增加了“区域坐标=roipoly(织物);” 代码如下: ` %%第一步 fabric = im

我正在使用MatLab网站上的代码,“使用Lab*颜色空间的基于颜色的分割”:

所以我尝试自己选择一些区域,而不是使用“加载区域坐标”,使用roipoly(织物),但我被卡住了。如何保存刚绘制的多边形的坐标?事实上,我是按照lennon310在解决方案II,页面底部的建议来做的:

我不确定什么时候保存
区域坐标
和执行
大小(区域坐标,1)

我做了以下更改(步骤1)

1) 删除“加载区域坐标”

2) 增加了“区域坐标=roipoly(织物);”

代码如下:

` %%第一步

fabric = imread(file);

figure(1);                                                                   %Create figure window. "If h is not the handle and is not the Number property value of an existing figure, but is an integer, then figure(h) creates a figure object and assigns its Number property the value h."
imshow(fabric)
title('fabric')



%load regioncoordinates; % 6 marices(?) labelled val(:,:,1-6), 5x2 (row x column)
region_coordinates = roipoly(fabric);

nColors = 6;
sample_regions = false([size(fabric,1) size(fabric,2) nColors]); %Initializing an Image Dimension, 3x3 (:,:,:) to zero? Zeros() for arrays only I guess.
                        %Size one is column, size two is row?
for count = 1:nColors
  sample_regions(:,:,count) = roipoly(fabric,region_coordinates(:,1,count),region_coordinates(:,2,count));

end

figure, imshow(sample_regions(:,:,2)),title('sample region for red'); 
%%步骤2

% Convert your fabric RGB image into an L*a*b* image using rgb2lab .

lab_fabric = rgb2lab(fabric);


%Calculate the mean a* and b* value for each area that you extracted with roipoly. These values serve as your color markers in a*b* space.

a = lab_fabric(:,:,2);
b = lab_fabric(:,:,3);
color_markers = zeros([nColors, 2]);%... I think this is initializing a 6x2 blank(0) array for colour storage. 6 for colours, 2 for a&b colourspace.

for count = 1:nColors
  color_markers(count,1) = mean2(a(sample_regions(:,:,count))); %Label for repmat, Marker for 
  color_markers(count,2) = mean2(b(sample_regions(:,:,count)));
end

%For example, the average color of the red sample region in a*b* space is

fprintf('[%0.3f,%0.3f] \n',color_markers(2,1),color_markers(2,2));
%%步骤3:使用最近邻规则对每个像素进行分类 %

%%步骤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

%figure, imshow(segmented_images(:,:,:,1)), title('Background of Fabric');
%Looks different somehow.
figure, imshow(segmented_images(:,:,:,2)), title('red objects');

figure, imshow(segmented_images(:,:,:,3)), title('green objects');

figure, imshow(segmented_images(:,:,:,4)), title('purple objects');

figure, imshow(segmented_images(:,:,:,5)), title('magenta objects');

figure, imshow(segmented_images(:,:,:,6)), title('yellow objects');



`

可以使用调用
roipoly
中的输出参数检索多边形的坐标。然后,您可以获得多边形的二进制掩码,以及顶点坐标(如果需要)

简单示例演示:

clear
clc
close all

A = imread('cameraman.tif');

figure;
imshow(A)

%// The vertices of the polygon are stored in xi and yi;
%// PolyMask is a binary image where pixels == 1 are white.
[polyMask, xi, yi] = roipoly(A);
这看起来像这样:

[row_white,col_white] = find(polyMask == 1);

如果希望看到带有二进制遮罩的顶点:

%// display polymask
imshow(polyMask)
hold on

%// Highlight vertices in red
scatter(xi,yi,60,'r')
hold off
其中给出了以下内容:

因此,总结一下:

1)多边形顶点存储在席和彝中。 2) 可以使用

imshow(polyMask)
打印多边形的二进制掩码

3) 如果您需要白色像素的坐标,您可以使用如下内容:

[row_white,col_white] = find(polyMask == 1);
那你就可以走了。希望有帮助