Шаг 2: Вычисление выборки цветов в цветовом пространстве L*a*b* для каждой локальной области

Существует возможность просмотра шести основных цветов изображения: фоновый цвет, красный, зеленый, пурпурный (фиолетовый), желтый и красно-фиолетовый (magenta). Отметим, что визуально эти цвета очень легко различаются между собой. Цветовое пространство L*a*b* (еще известное как CIELAB или CIE L*a*b*) позволяет четко отмечать эти визуальные различия.

Цветовое пространство L*a*b* получено на основе трехцветных значений CIE XYZ. Пространство L*a*b* включает информацию о значении интенсивности 'L*', значении цветности 'a*' (показывает какой цвет выбран на красно-зеленой оси) и значении цветности 'b*' (показывает какой цвет выбран на голубо-желтой оси).

Отметим, что при анализе цветов используются окрестности небольших размеров и при их вычислении берется усреднение в пространстве 'a*b*'. Эти цветовые метки можно использовать при классификации каждого пикселя.

Для упрощения демонстрации примера, считаем координаты области, которые хранятся в MAT-file.

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));endimshow(sample_regions(:, :, 2)), title('Пример красной области');

Преобразуем RGB-изображение материи в L*a*b*-изображение с использованием функций makecform и applycform.

cform=makecform('srgb2lab');lab_fabric=applycform(fabric, cform);Вычислим средние значения 'a*' и 'b*' для каждой области представленной roipoly. Эти значения могут служить маркерами в пространстве 'a*b*'.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Например, усреднение по красному цвету в цветовом пространстве 'a*b*' производится такdisp(sprintf('[%0.3f,%0.3f]', color_markers(2, 1), color_markers(2, 2)));