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 utilizando el espacio de color L*a*b*

En este ejemplo se muestra cómo identificar diferentes colores en la estructura mediante el análisis del espacio de color L*a*b*. La imagen de tejido se adquirió mediante el cuadro de herramientas de adquisición de imágenes™.

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 mediante las siguientes funciones en el Cuadro 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: Calcular 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 entre sí. El espacio de color L*a*b* (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ímulo de CIE XYZ. El espacio L*a*b* consta de una luminosidad 'L*' o capa de brillo, capa de cromaticidad 'a*' que indica dónde cae el color a lo largo del eje rojo-verde y capa de cromaticidad 'b*' que indica dónde cae el color a lo largo del eje azul-amarillo.

Su enfoque consiste en elegir una pequeña región de muestra para cada color y calcular el color promedio 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 almacenadas 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 tejido en una imagen L*a*b* utilizando .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 un valor '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 indicará 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ía como un píxel rojo.

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

color_labels = 0:nColors-1;

Inicializar matrices que se utilizarán en la clasificación de vecino 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 de vecinos más cercanos

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 

Muestre los cinco colores segmentados como un montaje. También muestre los píxeles de fondo de la imagen que no están clasificados como 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 los valores 'a*' y 'b*' de los colores etiquetados

Puede ver qué tan bien la clasificación de vecino 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 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');