В этом примере показано, как использовать сегментацию текстур для идентификации областей на основе их текстуры. Цель - отрезать собаку от пола ванной. Сегментация визуально очевидна из-за разницы в текстуре между регулярным, периодическим рисунком пола ванной комнаты и правильной, гладкой текстурой собачьего меха.
Из экспериментов известно, что фильтры Габора являются разумной моделью простых клеток в системе зрения млекопитающих. Из-за этого считается, что фильтры Габора являются хорошей моделью того, как люди различают текстуру, и поэтому являются полезной моделью для использования при разработке алгоритмов для распознавания текстуры. Этот пример использует основной подход, описанный в (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)
Создайте массив габорских фильтров, настроенных на различные частоты и ориентации. Набор частот и ориентаций предназначен для локализации различных, грубо ортогональных, подмножеств информации о частоте и ориентации во входном изображении. Регулярно пробуют ориентации между [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,[])

В этой визуализации очевидно, что имеется достаточная дисперсия в информации о признаках Габора для получения хорошей сегментации для этого изображения. Собака очень темная по сравнению с полом из-за различий в текстуре между собакой и полом.
Повторите k-означает кластеризацию пять раз, чтобы избежать локальных минимумов при поиске средств, которые минимизируют целевую функцию. Единственной предшествующей информацией, принятой в этом примере, является количество отдельных областей текстуры, присутствующих в сегментируемом изображении. В этом случае существуют две отдельные области. В этой части примера требуется Toolbox™ статистики и машинного обучения.
L = kmeans(X,2,'Replicates',5);Визуализация сегментации с помощью label2rgb.
L = reshape(L,[numRows numCols]); figure imshow(label2rgb(L))

Визуализация сегментированного изображения с помощью 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');
