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.
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™.
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')
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]
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;
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")
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');