В этом примере показано, как получить один фрейм изображения части красочной матрицы. Различные цвета в матрице идентифицированы, использовав цветовое пространство L*a*b.
Этот пример требует использования Image Processing Toolbox™.
% Create a video input object to access the image acquisition device. vid = videoinput('matrox', 1, 'M_NTSC'); % Capture one frame of data. fabric = getsnapshot(vid); figure(1) imshow(fabric) title('original image');
% Determine the image resolution. imageRes = vid.VideoResolution; imageWidth = imageRes(1); imageHeight = imageRes(2); % Once the video input object is no longer needed, delete % it and clear it from the workspace. delete(vid) clear vid
Считайте количество главных цветов видимым в изображении. Заметьте, как легко можно визуально отличить эти цвета друг от друга. Цветовое пространство L*a*b (также известный как CIELAB или CIE L*a*b) позволяет вам определить количество этих визуальных различий.
Цветовое пространство L*a*b выведено из CIE трехцветные значения XYZ. Пробел L*a*b состоит из яркости ('L') или слоя яркости, цветность разделяют указание на уровни, где цвет падает вдоль красно-зеленой оси и слоя 'b' цветности, указывающего, где цвет падает вдоль сине-желтой оси.
Ваш подход должен выбрать область небольшой выборки для каждого цвета и вычислить средний цвет каждой демонстрационной области на 'a*b' пробеле. Вы будете использовать эти цветовые маркеры, чтобы классифицировать каждый пиксель.
% Initialize storage for each sample region. colorNames = { 'red','green','purple','blue','yellow' }; nColors = length(colorNames); sample_regions = false([imageHeight imageWidth nColors]); % Select each sample region. f = figure; for count = 1:nColors f.Name = ['Select sample region for ' colorNames{count}]; sample_regions(:,:,count) = roipoly(fabric); end close(f); % Display a sample region. imshow(sample_regions(:,:,1)) title(['sample region for ' colorNames{1}]);
% Convert the fabric RGB image into an L*a*b image. cform = makecform('srgb2lab'); lab_fabric = applycform(fabric,cform); % Calculate the mean 'a' and 'b' value for each area extracted. % These values serve as your color markers in 'a*b' space. a = lab_fabric(:,:,2); b = lab_fabric(:,:,3); color_markers = repmat(0, [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 % For example, the average color of the second sample region in 'a*b' space is: disp( sprintf('[%0.3f,%0.3f]', color_markers(2,1), color_markers(2,2)) );
[105.956,147.867]
Каждый цветовой маркер теперь имеет и 'b' значение. Можно классифицировать каждый пиксель на изображение путем вычисления Евклидова расстояния между тем пикселем и каждым цветовым маркером. Наименьшее расстояние скажет вам, что пиксель наиболее тесно совпадает с тем цветовым маркером. Например, если бы расстояние между пикселем и вторым цветовым маркером является наименьшим, то пиксель был бы помечен как тот цвет.
% Create an array that contains your color labels: % 0 = background % 1 = red % 2 = green % 3 = purple % 4 = magenta % 5 = yellow color_labels = 0:(nColors-1); % Initialize matrices to be used in the nearest neighbor classification. a = double(a); b = double(b); distance = repmat(0,[size(a), nColors]); % Perform classification. for count = 1:nColors distance(:,:,count) = ( (a - color_markers(count,1)).^2 + ... (b - color_markers(count,2)).^2 ).^0.5; end [value, label] = min(distance, [], 3); label = color_labels(label); clear value distance;
Матрица метки содержит цветную метку для каждого пикселя в изображении матрицы. Используйте матрицу метки для отдельных объектов в исходном изображении матрицы цветом.
rgb_label = repmat(label, [1 1 3]); segmented_images = repmat(uint8(0), [size(fabric), nColors]); for count = 1:nColors color = fabric; color(rgb_label ~= color_labels(count)) = 0; segmented_images(:,:,:,count) = color; end imshow(segmented_images(:,:,:,1)); title([colorNames{1} ' objects'] );
imshow(segmented_images(:,:,:,2));
title([colorNames{2} ' objects'] );
imshow(segmented_images(:,:,:,3));
title([colorNames{3} ' objects'] );
imshow(segmented_images(:,:,:,4));
title([colorNames{4} ' objects'] );
imshow(segmented_images(:,:,:,5));
title([colorNames{5} ' objects'] );
Вы видите, как хорошо самая близкая соседняя классификация разделила различные цветные популяции путем графического вывода и 'b' значения пикселей, которые были классифицированы в отдельные цвета. В целях отображения пометьте каждую точку с ее цветной меткой.
purple = [119/255 73/255 152/255]; plot_labels = {'k', 'r', 'g', purple, 'b', 'y'}; figure for count = 1:nColors h(count) = 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');