exponenta event banner

Сегментация текстур с использованием габорских фильтров

В этом примере показано, как использовать сегментацию текстур для идентификации областей на основе их текстуры. Цель - отрезать собаку от пола ванной. Сегментация визуально очевидна из-за разницы в текстуре между регулярным, периодическим рисунком пола ванной комнаты и правильной, гладкой текстурой собачьего меха.

Из экспериментов известно, что фильтры Габора являются разумной моделью простых клеток в системе зрения млекопитающих. Из-за этого считается, что фильтры Габора являются хорошей моделью того, как люди различают текстуру, и поэтому являются полезной моделью для использования при разработке алгоритмов для распознавания текстуры. Этот пример использует основной подход, описанный в (A. K. Jain и F. Farrokhnia, «Unsupervised Texture Segmentation Using Gabor Filters», 1991) для выполнения сегментации текстур.

Чтение и отображение входного изображения

Чтение и отображение входного изображения. Этот пример сокращает изображение, чтобы сделать выполнение примера более быстрым.

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

Figure contains an axes. The axes contains an object of type image.

Проектный массив габорских фильтров

Создайте массив габорских фильтров, настроенных на различные частоты и ориентации. Набор частот и ориентаций предназначен для локализации различных, грубо ортогональных, подмножеств информации о частоте и ориентации во входном изображении. Регулярно пробуют ориентации между [0,150] градусами с шагом в 30 градусов. Длина волны образца в возрастающих степенях двух, начиная от 4/sqrt (2) до длины гипотенузы входного изображения. Эти комбинации частоты и ориентации взяты из [Jain,1991], приведенного во введении.

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);

Извлеките элементы величины Габора из исходного изображения. При работе с фильтрами Габора принято работать с откликом величины каждого фильтра. Отклик на величину Габора также иногда называют «энергией Габора». Каждое выходное изображение величины MxN Gabor в gabormag(:,:,ind) - выходной сигнал соответствующего фильтра Габора g(ind).

gabormag = imgaborfilt(Agray,g);

После обработки изображений величины Габора в элементы Габора.

Для использования откликов величины Габора в качестве функций для использования в классификации требуется некоторая постобработка. Эта постобработка включает гауссово сглаживание, добавление дополнительной пространственной информации в набор функций, изменение формы нашего набора функций на ожидаемую pca и kmeans функции и нормализация информации об элементе в соответствии с общей дисперсией и средним значением.

Каждое изображение величины Габора содержит некоторые локальные вариации, даже в хорошо сегментированных областях постоянной текстуры. Эти локальные вариации отбросят сегментацию. Мы можем компенсировать эти вариации, используя простую гауссову фильтрацию нижних частот для сглаживания информации о величине Габора. Мы выбираем сигму, которая соответствует фильтру Габора, извлекающему каждый элемент. Мы вводим сглаживающий термин K, который управляет количеством сглаживания, применяемого к откликам величины Габора.

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

При построении наборов элементов Габора для классификации полезно добавить карту пространственной информации о местоположении как в X, так и Y. Эта дополнительная информация позволяет классификатору отдавать предпочтение группировкам, которые близки друг к другу пространственно.

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

Преобразование данных в матрицу X формы, ожидаемой kmeans функция. Каждый пиксель в сетке изображения является отдельной точкой данных, и каждая плоскость в переменной featureSet является отдельной особенностью. В этом примере имеется отдельный признак для каждого фильтра в банке фильтров Габора, плюс два дополнительных признака из пространственной информации, добавленной на предыдущем шаге. Всего имеется 24 элемента Габора и 2 элемента пространственной характеристики для каждого пикселя во входном изображении.

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

Нормализуйте элементы как нулевое среднее, единичная дисперсия.

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

Визуализируйте набор элементов. Чтобы понять, как выглядят элементы величины Габора, можно использовать анализ основных компонентов, чтобы перейти от 26-D представления каждого пикселя во входном изображении к 1-D значению интенсивности для каждого пикселя.

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

Figure contains an axes. The axes contains an object of type image.

В этой визуализации очевидно, что имеется достаточная дисперсия в информации о признаках Габора для получения хорошей сегментации для этого изображения. Собака очень темная по сравнению с полом из-за различий в текстуре между собакой и полом.

Классифицировать элементы текстуры Габора с помощью kmean

Повторите k-означает кластеризацию пять раз, чтобы избежать локальных минимумов при поиске средств, которые минимизируют целевую функцию. Единственной предшествующей информацией, принятой в этом примере, является количество отдельных областей текстуры, присутствующих в сегментируемом изображении. В этом случае существуют две отдельные области. В этой части примера требуется Toolbox™ статистики и машинного обучения.

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

Визуализация сегментации с помощью label2rgb.

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

Figure contains an axes. The axes contains an object of type image.

Визуализация сегментированного изображения с помощью imshowpair. Проверьте изображения переднего плана и фона, полученные из маски BW, связанной с матрицей меток 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');

Figure contains an axes. The axes contains an object of type image.