Текстурируйте сегментацию Используя фильтры Габора

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

От экспериментирования известно, что фильтры Габора являются разумной моделью простых ячеек в системе видения млекопитающих. Из-за этого фильтры Габора, как думают, являются хорошей моделью того, как люди отличают структуру и являются поэтому полезной моделью, чтобы использовать при разработке алгоритмов, чтобы распознать структуру. Этот пример использует основной подход, описанный в (A. K. Джайн и Ф. Фаррокния, "Безнадзорная Сегментация Структуры Используя Фильтры Габора", 1991), чтобы выполнить сегментацию структуры.

Считайте и отобразите входное изображение

Считайте и отобразите входное изображение. Этот пример уменьшает изображение, чтобы сделать пример запущенным более быстро.

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

Разработайте массив фильтров Габора

Разработайте массив Фильтров Габора, которые настраиваются на различные частоты и ориентации. Набор частот и ориентаций разработан, чтобы локализовать различные, примерно ортогональные, подмножества частоты и информации об ориентации во входном изображении. Регулярно демонстрационные ориентации между [0,150] степени в области шагов 30 градусов. Демонстрационная длина волны в увеличивающихся степенях двойки, начинающих с 4/sqrt (2) до длины гипотенузы входного изображения. Эти комбинации частоты и ориентации взяты из [джайн, 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 в 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 представления каждого пикселя во входном изображении в 1D значение интенсивности для каждого пикселя.

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

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

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

Повторите k-средние-значения, кластеризирующиеся пять раз, чтобы избежать локальных минимумов при поиске средних значений, которые минимизируют целевую функцию. Единственная предшествующая информация, принятая в этом примере, - то, сколько отличных областей структуры присутствует в сегментируемом изображении. В этом случае существует две отличных области. Эта часть примера требует Statistics and Machine Learning 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');