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