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 de texturas mediante filtros de textura

En este ejemplo se muestra cómo utilizar la segmentación de texturas para identificar regiones basándose en su textura. Su objetivo es segmentar dos tipos de tejido en una imagen utilizando filtros de textura.

Paso 1: Leer imagen

Leído en bag.png.

I = imread('bag.png'); figure imshow(I)

Paso 2: Crear imagen de textura

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

E = entropyfilt(I);

Utilice rescale para reescalar la imagen de textura E de modo que sus valores estén en el intervalo predeterminado para una imagen doble.

Eim = rescale(E); figure imshow(Eim)

Paso 3: Crear máscara en bruto para la textura inferior

Umbral de la imagen reescalada 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, .8); imshow(BW1);

figure imshow(I)

Los objetos segmentados de la imagen binaria BW1 son blancos. Si se compara BW1 con I, se observa que la textura superior está demasiado segmentada (varios objetos blancos) y la textura inferior se segmenta casi en su totalidad. Puede extraer la textura inferior usando bwareaopen.

BWao = bwareaopen(BW1,2000); imshow(BWao)

Utilice imclose para suavizar los bordes y cerrar los orificios abiertos del objeto en BWao. Un vecindario de 9 por 9 es seleccionado porque este vecindario también fue usado por entropyfilt.

nhood = true(9); closeBWao = imclose(BWao,nhood); imshow(closeBWao)

Utilice imfill para rellenar los orificios del objeto en closeBWao.

roughMask = imfill(closeBWao,'holes');

Paso 4: Utilice la máscara áspera para segmentar la textura superior

Compare la imagen binaria roughMask a la imagen original I. Note que la máscara de la textura inferior no es perfecta porque la máscara no se extiende hasta la parte inferior de la imagen. Sin embargo, puede utilizar roughMask para segmentar la textura superior.

imshow(roughMask);

figure imshow(I)

Obtenga la imagen RAW de la textura superior usando roughMask.

I2 = I; I2(roughMask) = 0; imshow(I2)

Utilice entropyfilt para calcular la imagen de textura.

E2 = entropyfilt(I2); E2im = rescale(E2); imshow(E2im)

Umbral E2im utilizando un umbral global.

BW2 = imbinarize(E2im); imshow(BW2)

figure, imshow(I);

Si se compara BW2 con I, se observa que hay dos objetos segmentados en BW2. Utilice bwareaopen para obtener una máscara para la textura superior.

mask2 = bwareaopen(BW2,1000); imshow(mask2)

Paso 5: Mostrar resultados de segmentación

Utilice mask2 para extraer la textura superior e inferior de I.

texture1 = I; texture1(~mask2) = 0; texture2 = I; texture2(mask2) = 0;
imshow(texture1)

figure imshow(texture2)

Delinee el límite entre las dos texturas.

boundary = bwperim(mask2); segmentResults = I; segmentResults(boundary) = 255; imshow(segmentResults)

Uso de otros filtros de textura en segmentación

En lugar de entropyfilt, puede utilizar stdfilt y rangefilt con otras funciones morfológicas para lograr resultados de segmentación similares.

S = stdfilt(I,nhood); imshow(rescale(S))

R = rangefilt(I,ones(5)); imshow(R)