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