Esta página es para la versión anterior. La página correspondiente en inglés se eliminó en la versión actual.

Segmentación basada en color mediante el espacio de color L * a * b *

En este ejemplo se muestra cómo identificar diferentes colores en la tela analizando el ColorSpace L * a * b *. La imagen de fabric se adquirió utilizando Image Acquisition Toolbox ™.

Paso 1: Adquirir imagen

Leer en la imagen fabric.png, que es una imagen de tela colorida. En lugar de utilizar fabric.png, puede adquirir una imagen utilizando las siguientes funciones en la caja de herramientas de adquisición de imágenes.

% Access a Matrox(R) frame grabber attached to a Pulnix TMC-9700 camera, and % acquire data using an NTSC format.   % vidobj = videoinput('matrox',1,'M_NTSC_RGB');  % Open a live preview window.  Point camera onto a piece of colorful fabric. % preview(vidobj);  % Capture one frame of data. % fabric = getsnapshot(vidobj); % imwrite(fabric,'fabric.png','png');  % Delete and clear associated variables. % delete(vidobj) % clear vidobj;  fabric = imread('fabric.png'); figure(1), imshow(fabric), title('fabric');

Paso 2: Calcular colores de muestra en el espacio de color L * a * b * para cada región

Se pueden ver seis colores principales en la imagen: el color de fondo, rojo, verde, púrpura, amarillo y magenta. Observe con qué facilidad puede distinguir visualmente estos colores unos de otros. El l * a * b * ColorSpace (también conocido como CIELAB o CIE L * a * b *) le permite cuantificar estas diferencias visuales.

El espacio de color L * a * b * se deriva de los valores de triestímulos CIE XYZ. El espacio l * a * b * consta de una luminosidad ' l * ' o capa de brillo, capa de cromatismo ' a * ' que indica donde el color cae a lo largo del eje rojo-verde, y la capa de cromatismo ' b * ' indicando donde el color cae a lo largo del eje azul-amarillo.

Su enfoque es elegir una pequeña región de muestra para cada color y calcular el color medio de cada región de muestra en el espacio ' a * b * '. Usará estos marcadores de color para clasificar cada píxel.

Para simplificar este ejemplo, cargue las coordenadas de la región que se almacenan en un archivo 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');

Convierta su imagen RGB de fabric en una imagen L * a * b * usando rgb2lab.

lab_fabric = rgb2lab(fabric);

Calcule el valor medio de ' a * ' y ' b * ' para cada área que extrajo con roipoly. Estos valores sirven como marcadores de color en el espacio ' a * b * '.

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

Por ejemplo, el color promedio de la región de muestra roja en el espacio ' a * b * ' es

fprintf('[%0.3f,%0.3f] \n',color_markers(2,1),color_markers(2,2));
[69.828,20.106]  

Paso 3: Clasificar cada píxel utilizando la regla de vecino más cercana

Cada marcador de color tiene ahora un valor ' a * ' y un ' b * '. Puede clasificar cada píxel en la imagen lab_fabric calculando la distancia euclidiana entre ese píxel y cada marcador de color. La distancia más pequeña le dirá que el píxel coincide más estrechamente con ese marcador de color. Por ejemplo, si la distancia entre un píxel y el marcador de color rojo es la más pequeña, el píxel se etiquetará como un píxel rojo.

Cree una matriz que contenga las etiquetas de color, es decir, 0 = fondo, 1 = rojo, 2 = verde, 3 = púrpura, 4 = magenta y 5 = amarillo.

color_labels = 0:nColors-1;

Inicialice las matrices que se usarán en la clasificación vecina más cercana.

a = double(a); b = double(b); distance = zeros([size(a), nColors]);

Realizar clasificación

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;

Paso 4: Mostrar los resultados de la clasificación vecina más cercana

La matriz de etiquetas contiene una etiqueta de color para cada píxel de la imagen de fabric. Utilice la matriz Label para separar los objetos de la imagen de fabric original por color.

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   imshow(segmented_images(:,:,:,2)), title('red objects');

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

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

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

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

Paso 5: Mostrar los valores ' a * ' y ' b * ' de los colores etiquetados.

Usted puede ver lo bien que la clasificación vecina más cercana separó las diferentes poblaciones de color trazando los valores ' a * ' y ' b * ' de píxeles que se clasificaron en colores separados. Para los propósitos de la exhibición, Etiquete cada punto con su etiqueta del color.

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');