Фильтр Габора на каждом суперпикселе - PullRequest
0 голосов
/ 10 мая 2018

Я работаю над суперпикселем для извлечения функций. Я успешно применил суперпиксельную функцию к изображению.

A = imread('kobi.png');
[L,N] = superpixels(A,5);
figure
BW = boundarymask(L);
figure;imshow(imoverlay(A,BW,'cyan'),'InitialMagnification',67)

enter image description here

Теперь я хочу извлечь текстурный элемент из каждого сегмента (то есть Габора). Кто-нибудь, пожалуйста, помогите мне объяснить, как я могу применить функции Gabor к каждому суперпикселю?

UPDATE:

idx=label2idx(L);
meanColor = zeros(N,3);
[m,n] = size(L);
for  i = 1:N
       meanColor(i,1) = mean(A(idx{i}));
    meanColor(i,2) = mean(A(idx{i}+m*n));
    meanColor(i,3) = mean(A(idx{i}+2*m*n));
end

numColors = 6;
[pidx,cmap] = kmeans(meanColor,numColors,'replicates',2);
cmap = lab2rgb(cmap);
Lout = zeros(size(A,1),size(A,2));
for i = 1:N
    Lout(idx{i}) = pidx(i);
end
imshow(label2rgb(Lout))

enter image description here Как я могу иметь отдельную переменную для каждой переменной

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Следуя инструкции MATLAB о возможностях Gabor , я могу применить банк фильтров Gabor к изображению 'kobi':

wavelengthMin = 4/sqrt(2);
wavelength = 2.^(0:4) * wavelengthMin;
deltaTheta = 45;
orientation = 0:deltaTheta:(180-deltaTheta);
g = gabor(wavelength,orientation);

A = imread('kobi.png');
Agray = rgb2gray(A);
gabormag = imgaborfilt(Agray,g);

g содержит, в данном случае, 20 ядер фильтров (см. Документацию по gabor). imgaborfilt применяет каждое из этих ядер (путем свертки) к изображению Agray, версии серого значения изображения 'kobi'. gabormag теперь представляет собой трехмерное изображение с 20 плоскостями, каждая из которых является величиной выходного сигнала одного из фильтров Габора.

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

[L,N] = superpixels(A,500);

L является помеченным изображением: каждый пиксель имеет значение, соответствующее идентификатору суперпикселя. Эти метки начинаются с 1 и являются последовательными.

Используя regionprops, мы можем вычислить среднюю интенсивность в каждой маркированной области:

K = size(gabormag,3);
gaborfeatures = zeros(N,K);
for ii=1:K
   res = regionprops(L,gabormag(:,:,ii),'MeanIntensity');
   gaborfeatures(:,ii) = [res.MeanIntensity]';
end

(Вы также можете использовать label2idx и перебирать его выходные массивы, как вы делали при редактировании вашего вопроса.)

gaborfeatures теперь содержит одну строку для каждого суперпикселя и один столбец для каждой функции Gabor. Например, gaborfeatures(294,:) - это функции Габора для суперпикселя L==294, который у собаки на носу:

>> gaborfeatures(294,:)
ans =
   1.0e+04 *
  Columns 1 through 9
    0.0008    0.0040    0.0171    0.0848    1.0617    0.0009    0.0040    0.0193    0.1304
  Columns 10 through 18
    0.7753    0.0008    0.0040    0.0165    0.0872    1.0672    0.0010    0.0046    0.0208
  Columns 19 through 20
    0.0842    0.6736
0 голосов
/ 10 мая 2018

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

for i=1:size(Lout,1)
    for j=1:size(Lout,2)
        if (Lout (i,j) == 4)
            Patch(i,j)=A(i,j);
        end
    end
end


mask = Patch > 0;
mask = bwareafilt(mask, 1);
% Invert mask and get bounding box.
props = regionprops(mask, 'BoundingBox');
% Crop image.
croppedImage = imcrop(Patch, props.BoundingBox);
figure;imshow(croppedImage)
...