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

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

Из экспериментов известно, что фильтры Габора являются разумной моделью простых камер в системе зрения млекопитающих. Из-за этого фильтры Габора считаются хорошей моделью того, как люди различают текстуру, и поэтому являются полезной моделью, которую можно использовать при разработке алгоритмов для распознавания текстуры. Этот пример использует основной подход, описанный в (A. K. Jain and 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);

Извлеките функции величины Габора из исходного изображения. При работе с фильтрами Gabor обычно работает с величиной реакцией каждого фильтра. Ответ величины Габора также иногда упоминается как «Gabor Energy». Каждое MxN Гаморская величина выводит изображение в 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));

Визуализируйте набор функций. Чтобы получить представление о том, как выглядят величины функций Габора, Principal Component Analysis может использоваться, чтобы перейти от 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.

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

Классификация функций текстуры Габора с помощью kmeans

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

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.