Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Segmentación de textura mediante filtros de entropía

En este ejemplo se muestra cómo identificar y segmentar regiones en función de su textura.

Leer una imagen

Lea una imagen en escala de grises de patrones de textura de una bolsa y muéstrela.

I = imread('bag.png');
imshow(I)
title('Original Image')

Crear una imagen de textura

Utilice entropyfilt para crear una imagen de textura. La función entropyfilt devuelve un arreglo en el que cada píxel de salida contiene el valor de entropía del entorno 9 por 9 alrededor del píxel correspondiente en la imagen de entrada I. La entropía es una medida estadística de aleatoriedad.

También se puede utilizar stdfilt y rangefilt para conseguir resultados de segmentación similares. Para compararar con la imagen de textura de entropía local, cree imágenes de textura S y R que muestren la desviación estándar local y el rango local, respectivamente.

E = entropyfilt(I);
S = stdfilt(I,ones(9));
R = rangefilt(I,ones(9));

Use rescale para volver a escalar las imágenes de textura E y S de modo que los valores de los píxeles estén en el rango [0, 1] tal como se espera de imágenes de tipo de datos double.

Eim = rescale(E);
Sim = rescale(S);

Muestre las tres imágenes de textura en un montaje.

montage({Eim,Sim,R},'Size',[1 3],'BackgroundColor','w',"BorderSize",20)
title('Texture Images Showing Local Entropy, Local Standard Deviation, and Local Range')

Crear una máscara para la textura inferior

A continuación, en este ejemplo se procesa la imagen de textura de entropía Eim. Para obtener unos resultados de segmentación similares, puede repetir un proceso similar para los otros dos tipos de imágenes de texturas con otras funciones morfológicas.

Establezca un umbral para la imagen con la escala cambiada Eim para segmentar las texturas. Se selecciona un valor de umbral de 0.8 porque es aproximadamente el valor de intensidad de los píxeles a lo largo del límite entre las texturas.

BW1 = imbinarize(Eim,0.8);
imshow(BW1)
title('Thresholded Texture Image')

Los objetos segmentados en la imagen binaria BW1 son blancos. Si compara BW1 con I, verá que la textura superior está demasiado segmentada (varios objetos blancos) y que la textura inferior está segmentada prácticamente en su totalidad. Elimine los objetos de la textura superior empleando bwareaopen.

BWao = bwareaopen(BW1,2000);
imshow(BWao)
title('Area-Opened Texture Image')

Utilice imclose para suavizar los bordes y cerrar los huecos del objeto en BWao. Especifique el entorno 9 por 9 utilizado por entropyfilt.

nhood = ones(9);
closeBWao = imclose(BWao,nhood);
imshow(closeBWao)
title('Closed Texture Image')

Utilice imfill para rellenar los huecos del objeto en closeBWao. La máscara de la textura inferior no es perfecta porque la máscara no abarca toda la parte inferior de la imagen. Sin embargo, puede utilizar la máscara para segmentar las texturas.

mask = imfill(closeBWao,'holes');
imshow(mask);
title('Mask of Bottom Texture')

Utilizar una máscara para segmentar texturas

Separe las texturas en dos imágenes distintas.

textureTop = I;
textureTop(mask) = 0;
textureBottom = I;
textureBottom(~mask) = 0;
montage({textureTop,textureBottom},'Size',[1 2],'BackgroundColor','w',"BorderSize",20)
title('Segmented Top Texture (Left) and Segmented Bottom Texture (Right)')

Mostrar resultados de la segmentación

Cree una matriz de etiqueta que tenga la etiqueta 1 en la que la máscara sea false y la etiqueta 2 en la que la máscara sea true. Superponga la matriz de etiqueta en la imagen original.

L = mask+1;
imshow(labeloverlay(I,L))
title('Labeled Segmentation Regions')

Dibuje el contorno entre dos texturas en cian.

boundary = bwperim(mask);
imshow(labeloverlay(I,boundary,"Colormap",[0 1 1]))
title('Boundary Between Textures')

Consulte también

| | | | | |