l*a*b 颜色分割
Colour Segmentation by l*a*b
我正在使用 MatLab 网站上的代码,"Color-Based Segmentation Using the Lab* Color Space":
http://www.mathworks.com/help/images/examples/color-based-segmentation-using-the-l-a-b-color-space.html
所以我尝试自己 select 一些区域,而不是使用 "load region_coordinates",使用 roipoly(fabric),但我被卡住了。如何保存刚绘制的多边形的坐标?实际上,我在页面底部的解决方案 II 中遵循了 lennon310 的建议:
A few questions about color segmentation with L*a*b*
我不确定何时保存 region_coordinates
并执行 size(region_coordinates,1)
我做了以下更改(第 1 步):
1) 已删除 "load region_coordinates"
2) 添加了 "region_coordinates = roipoly(fabric);"
代码如下:
`
%% 步骤 1
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 步:使用最近邻规则对每个像素进行分类
%
color_labels = 0:nColors-1;
% Initialize matrices to be used in the nearest neighbor classification.
a = double(a);
b = double(b);
distance = zeros([size(a), nColors]);
%Perform classification, Elucidean Distance.
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;
%% 第四步:显示最近邻分类结果
%
% 标签矩阵包含织物图像中每个像素的颜色标签。
% 使用标签矩阵将原始织物图像中的对象按颜色分开。
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);
看起来像这样:
如果您想查看带有二进制掩码的顶点:
%// display polymask
imshow(polyMask)
hold on
%// Highlight vertices in red
scatter(xi,yi,60,'r')
hold off
给出以下内容:
总结一下:
1) 多边形的顶点存储在 xi 和 yi 中。
2) 您可以使用 imshow(polyMask)
.
绘制多边形的 binaryMask
3) 如果你需要白色像素的坐标,你可以这样使用:
[row_white,col_white] = find(polyMask == 1);
然后就可以开始了。希望对您有所帮助!
我正在使用 MatLab 网站上的代码,"Color-Based Segmentation Using the Lab* Color Space": http://www.mathworks.com/help/images/examples/color-based-segmentation-using-the-l-a-b-color-space.html
所以我尝试自己 select 一些区域,而不是使用 "load region_coordinates",使用 roipoly(fabric),但我被卡住了。如何保存刚绘制的多边形的坐标?实际上,我在页面底部的解决方案 II 中遵循了 lennon310 的建议: A few questions about color segmentation with L*a*b*
我不确定何时保存 region_coordinates
并执行 size(region_coordinates,1)
我做了以下更改(第 1 步):
1) 已删除 "load region_coordinates"
2) 添加了 "region_coordinates = roipoly(fabric);"
代码如下:
` %% 步骤 1
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 步:使用最近邻规则对每个像素进行分类 %
color_labels = 0:nColors-1;
% Initialize matrices to be used in the nearest neighbor classification.
a = double(a);
b = double(b);
distance = zeros([size(a), nColors]);
%Perform classification, Elucidean Distance.
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;
%% 第四步:显示最近邻分类结果 % % 标签矩阵包含织物图像中每个像素的颜色标签。 % 使用标签矩阵将原始织物图像中的对象按颜色分开。
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);
看起来像这样:
如果您想查看带有二进制掩码的顶点:
%// display polymask
imshow(polyMask)
hold on
%// Highlight vertices in red
scatter(xi,yi,60,'r')
hold off
给出以下内容:
总结一下:
1) 多边形的顶点存储在 xi 和 yi 中。
2) 您可以使用 imshow(polyMask)
.
3) 如果你需要白色像素的坐标,你可以这样使用:
[row_white,col_white] = find(polyMask == 1);
然后就可以开始了。希望对您有所帮助!