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 con filtros Gabor

Este ejemplo muestra cómo utilizar la segmentación de texturas para identificar las regiones en función de su textura. El objetivo es segmentar el perro desde el piso del baño. La segmentación es visualmente obvia debido a la diferencia de textura entre el patrón regular, periódico del piso del baño, y la textura regular y lisa 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 mamífero. Debido a esto, los filtros Gabor se cree que son un buen modelo de cómo los humanos distinguen la textura, y por lo tanto son un modelo útil a utilizar al diseñar algoritmos para reconocer la textura. En este ejemplo se utiliza el enfoque básico descrito en (A. K. Jain y F. Farrokhnia, "segmentación de texturas sin supervisión mediante filtros Gabor", 1991) para realizar la segmentación de texturas.

Lea y visualice la imagen de entrada

Lea y visualice 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 estén sintonizados con 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. Muestra regularmente orientaciones entre [0150] grados en pasos de 30 grados. Muestra la longitud de onda en potencias crecientes de dos a partir de 4/sqrt (2) hasta la longitud de la hipotenusa de la imagen de entrada. Estas combinaciones de frecuencia y orientación se toman de [Jain, 1991] citadas 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 características de magnitud 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 Gabor también se conoce a veces como "Gabor Energy". Cada imagen de salida de magnitud MxN Gabor 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 Gabor.

Para utilizar las respuestas de magnitud Gabor como características para su uso en la clasificación, se requiere algún post-procesamiento. Este post-procesamiento incluye el suavizado gaussiano, añadiendo información espacial adicional al conjunto de características, remodelando nuestro conjunto de características con la forma esperada por las funciones y normalizando la información de la 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 se desharán de la segmentación. Podemos compensar estas variaciones usando un simple filtro de paso bajo gaussiano para suavizar la información de magnitud Gabor. Elegimos un Sigma que coincida con el filtro Gabor que extrajo cada característica. Introducimos un término K de suavizado que controla cuánto suavizado 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 características 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 las agrupaciones que están próximas juntas espacialmente.

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

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

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

Normalice las operaciones para que sean media cero, desviación de unidad.

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

Visualice el conjunto de características. Para tener una idea de lo que parecen las características de magnitud Gabor, el análisis de componentes principales se puede utilizar para pasar de una representación 26-D de cada píxel de la imagen de entrada a un valor de intensidad 1-D 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.

Clasifique las características de textura Gabor utilizando Kmeans

Repetir k-significa agrupar cinco veces para evitar los 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 de textura distintas están presentes en la imagen que se está segmentando. En este caso, hay dos regiones distintas. Esta parte del ejemplo requiere el™ de herramientas de aprendizaje automático y estadísticas.

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

Visualice la segmentación utilizando.label2rgb

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

Visualice la imagen segmentada usando.imshowpair Examine las imágenes de primer plano y de fondo que resultan de la máscara BW que está 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');