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

En este ejemplo se muestra cómo utilizar la segmentación de texturas para identificar regiones en función de su textura. El objetivo es segmentar al perro desde el suelo del baño. La segmentación es visualmente obvia debido a la diferencia de textura entre el patrón regular y periódico del suelo del baño, y la textura regular y suave del pelaje del perro.

De la experimentación, se sabe que los filtros Gabor son un modelo razonable de células simples en el sistema de visión de Mammalian. Debido a esto, se cree que los filtros Gabor son un buen modelo de cómo los seres humanos distinguen la textura y, por lo tanto, son un modelo útil para usar al diseñar algoritmos para reconocer la textura. Este ejemplo utiliza el enfoque básico descrito en (A. K. Jain y F. Farrokhnia, "Unsupervised Texture Segmentation Using Gabor Filters",1991) para realizar la segmentación de texturas.

Leer y mostrar la imagen de entrada

Lea y muestre la imagen de entrada. En este ejemplo se reduce la imagen para que el ejemplo se ejecute más rápidamente.

A = imread('kobi.png'); A = imresize(A,0.25); Agray = rgb2gray(A); figure imshow(A)

Matriz de diseño de filtros Gabor

Diseñe una matriz de filtros Gabor que se ajustan a diferentes frecuencias y orientaciones. El conjunto de frecuencias y orientaciones está diseñado para localizar diferentes, aproximadamente ortogonales, subconjuntos de información de frecuencia y orientación en la imagen de entrada. Muestrear regularmente orientaciones entre [0,150] grados en pasos de 30 grados. Longitud de onda de muestra en potencias crecientes de dos a partir de 4/sqrt(2) hasta la longitud de hipotenusa de la imagen de entrada. Estas combinaciones de frecuencia y orientación se toman de [Jain,1991] citado en la introducción.

imageSize = size(A); numRows = imageSize(1); numCols = imageSize(2);  wavelengthMin = 4/sqrt(2); wavelengthMax = hypot(numRows,numCols); n = floor(log2(wavelengthMax/wavelengthMin)); wavelength = 2.^(0:(n-2)) * wavelengthMin;  deltaTheta = 45; orientation = 0:deltaTheta:(180-deltaTheta);  g = gabor(wavelength,orientation);

Extraiga las entidades de magnitud de Gabor de la imagen de origen. Cuando se trabaja con filtros Gabor, es común trabajar con la respuesta de magnitud de cada filtro. La respuesta de magnitud de Gabor también se conoce a veces como "Gabor Energy". Cada imagen de salida de magnitud MxN Gabor en es la salida del filtro Gabor correspondiente.gabormag(:,:,ind)g(ind)

gabormag = imgaborfilt(Agray,g);

Post-procesar las imágenes de magnitud Gabor en características de Gabor.

Para utilizar las respuestas de magnitud de Gabor como características para su uso en la clasificación, se requiere algún procesamiento posterior. Este procesamiento posterior incluye el suavizado gaussiano, la adición de información espacial adicional al conjunto de entidades, la remodelación de nuestro conjunto de entidades en el formulario esperado por las funciones y la normalización de la información de entidad a una varianza y media comunes.pcakmeans

Cada imagen de magnitud Gabor contiene algunas variaciones locales, incluso dentro de regiones bien segmentadas de textura constante. Estas variaciones locales eliminarán la segmentación. Podemos compensar estas variaciones usando un simple filtrado gaussiano de paso bajo para suavizar la información de magnitud de Gabor. Elegimos un sigma que se combina con el filtro Gabor que extrajo cada característica. Introducimos un término de suavizado K que controla la cantidad de suavizado que se aplica a las respuestas de magnitud Gabor.

for i = 1:length(g)     sigma = 0.5*g(i).Wavelength;     K = 3;     gabormag(:,:,i) = imgaussfilt(gabormag(:,:,i),K*sigma);  end

Al construir conjuntos de entidades De Gabor para la clasificación, es útil agregar un mapa de información de ubicación espacial en X e Y. Esta información adicional permite al clasificador preferir agrupaciones que están juntas espacialmente.

X = 1:numCols; Y = 1:numRows; [X,Y] = meshgrid(X,Y); featureSet = cat(3,gabormag,X); featureSet = cat(3,featureSet,Y);

Cambie la forma de los datos en una matriz del formulario esperado por la función.Xkmeans Cada píxel de la cuadrícula de la imagen es un punto de datos independiente y cada plano de la variable es una entidad independiente.featureSet En este ejemplo, hay una entidad independiente para cada filtro en el banco de filtros de Gabor, además de dos entidades adicionales de la información espacial que se agregó en el paso anterior. En total, hay 24 entidades Gabor y 2 entidades espaciales para cada píxel en la imagen de entrada.

numPoints = numRows*numCols; X = reshape(featureSet,numRows*numCols,[]);

Normalizar las operaciones para que sean media cero, varianza unitaria.

X = bsxfun(@minus, X, mean(X)); X = bsxfun(@rdivide,X,std(X));

Visualice el conjunto de características. Para hacerse una idea de cómo se ven las características de magnitud de Gabor, el Análisis de componentes principales se puede utilizar para pasar de una representación 26D de cada píxel de la imagen de entrada a un valor de intensidad 1D para cada píxel.

coeff = pca(X); feature2DImage = reshape(X*coeff(:,1),numRows,numCols); figure imshow(feature2DImage,[])

Es evidente en esta visualización que hay suficiente varianza en la información de la característica Gabor para obtener una buena segmentación para esta imagen. El perro es muy oscuro en comparación con el suelo debido a las diferencias de textura entre el perro y el suelo.

Clasificar las características de textura de Gabor usando kmeans

Repetir k-means clustering cinco veces para evitar mínimos locales al buscar medios que minimicen la función objetiva. La única información previa que se asume en este ejemplo es cuántas regiones distintas de textura están presentes en la imagen que se está segmentando. Hay dos regiones distintas en este caso. Esta parte del ejemplo requiere el cuadro de herramientas Estadísticas y Aprendizaje automático™.

L = kmeans(X,2,'Replicates',5);

Visualice la segmentación mediante .label2rgb

L = reshape(L,[numRows numCols]); figure imshow(label2rgb(L))

Visualice la imagen segmentada utilizando .imshowpair Examine las imágenes de primer plano y de fondo resultantes de la máscara BW asociada a la matriz de etiquetas L.

Aseg1 = zeros(size(A),'like',A); Aseg2 = zeros(size(A),'like',A); BW = L == 2; BW = repmat(BW,[1 1 3]); Aseg1(BW) = A(BW); Aseg2(~BW) = A(~BW); figure imshowpair(Aseg1,Aseg2,'montage');