Фильтр Габора на каждом суперпикселе

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

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

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

ОБНОВИТЬ:

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))

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

2 ответа

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

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)

Следуя инструкции 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,:) особенности Gabor для суперпикселя 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
Другие вопросы по тегам