Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

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

Este ejemplo muestra cómo identificar diferentes colores en la tela mediante el análisis del espacio de color L * a * b *. La imagen de la tela se adquirió utilizando Image Acquisition Toolbox™.

Paso 1: adquirir imagen

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

% 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'); imshow(fabric) title('Fabric')

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

Puede ver seis colores principales en la imagen: el color de fondo, rojo, verde, púrpura, amarillo y magenta. Observe lo fácil que puede distinguir visualmente estos colores uno del otro. El espacio de color L * a * b * (también conocido como CIELAB o CIE L * a * b *) permite cuantificar estas diferencias visuales.

El espacio de color L * a * b * se deriva de los valores de triestímulo CIE XYZ. El espacio L * a * b * consta de una luminosidad ' L * ' o capa de brillo, la capa de cromaticidad ' a * ' que indica dónde el color cae a lo largo del eje rojo-verde, y la capa de cromaticidad ' b * ' que indica 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 * '. Utilizará estos marcadores de color para clasificar cada píxel.

Para simplificar este ejemplo, cargue las coordenadas de 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 la tela en una imagen L * a * b * usando.rgb2lab

lab_fabric = rgb2lab(fabric);

Calcule el valor medio ' a * ' y ' b * ' para cada área con la que extrajo.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 medio 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 usando la regla de vecino más cercano

Cada marcador de color ahora tiene un valor ' a * ' y ' b * '. Puede clasificar cada píxel de la imagen calculando la distancia euclidiana entre ese píxel y cada marcador de color.lab_fabric La distancia más pequeña le dirá que el píxel más estrechamente coincide 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ía como un píxel rojo.

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

color_labels = 0:nColors-1;

Inicializar matrices que se utilizarán en la clasificación de vecino más cercano.

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

Realice la 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 de vecino más cercano

La matriz de etiquetas contiene una etiqueta de color para cada píxel de la imagen de tejido. Utilice la matriz de etiquetas para separar los objetos de la imagen de tejido 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 

Visualice los cinco colores segmentados como un montaje. También muestra los píxeles de fondo de la imagen que no están clasificados como un color.

montage({segmented_images(:,:,:,2),segmented_images(:,:,:,3) ...     segmented_images(:,:,:,4),segmented_images(:,:,:,5) ...     segmented_images(:,:,:,6),segmented_images(:,:,:,1)}); title("Montage of Red, Green, Purple, Magenta, and Yellow Objects, and Background")

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

Puede ver qué tan bien la clasificación de vecino más cercano separó las diferentes poblaciones de color mediante el trazado de los valores ' a * ' y ' b * ' de los píxeles que se clasificaron en colores separados. Para fines de visualización, Etiquete cada punto con su etiqueta de 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');