Применить фильтр Габора к входному изображению

11

Я пытался применить фильтр Габора с определенной шкалой (в соответствии с моими значениями лямбда и сигма, так что это ( 7x7 ) и для 4 ориентаций (0, , и ) для входного изображения в оттенках серого. ππ4 3ππ23π4

В моем коде три шага достигнуты:

  1. Создать фильтр Габора

  2. Прочитайте изображение RGB, затем преобразуйте его в оттенки серого и, наконец, удвойте.

  3. Примените созданный gabor к входному изображению ( здесь я не уверен, что мой код верен, поэтому мне нужно ваше мнение )

1) -------------- создайте фильтр Габора (размер = 7х7 и 4 ориентации)

%define the five parameters
theta=....; %either 0 or pi/4 or pi/2 or 3pi/4
lambda=3.5;
gamma=0.3;
sigma=2.8;
psi=0;

sigma_x = sigma;
sigma_y = sigma/gamma;

nstds = 5;
xmax = max(abs(nstds*sigma_x*cos(theta)),abs(nstds*sigma_y*sin(theta)));
xmax = ceil(max(1,xmax));
ymax = max(abs(nstds*sigma_x*sin(theta)),abs(nstds*sigma_y*cos(theta)));
ymax = ceil(max(1,ymax));
xmin = -xmax; ymin = -ymax;
[x,y] = meshgrid(xmin:xmax,ymin:ymax);

x_theta=x*cos(theta)+y*sin(theta);
y_theta=-x*sin(theta)+y*cos(theta);

gb= exp(-.5*(x_theta.^2/sigma_x^2+y_theta.^2/sigma_y^2)).*cos(2*pi/lambda*x_theta+psi);

figure(2);
imshow(gb);
title('theta=...');
%imagesc(gb);
%colormap(gray);
%title('theta=...');

введите описание изображения здесь

2) ------------ Прочитать входное изображение

I=imread('piano.jpg');
image_resize=imresize(I, [160,160]);
image_gray=rgb2gray(image_resize);
image_double=im2double(image_gray);
figure(1);
imshow(image_double);

введите описание изображения здесь

3) ----- примените созданный выше gabor к входному изображению (напомним, что я не уверен, что код на этом шаге верен на 100%, поэтому мне нужно ваше мнение и ваша помощь, если у вас есть правильный ответ. )

figure(3);
filtered = conv2(image_double,gb);
imagesc(filtered);
colormap(gray);
title('theta=....');

введите описание изображения здесь

Листа
источник
Кроме того, если вы используете conv2, пожалуйста, используйте его с той же опцией.
Толга Бёрдал
Ошибка: Файл: Practise1.m Строка: 3 Столбец: 7 Выражение слева от знака равенства не является допустимым целевым объектом для назначения. Я обнаружил эту ошибку при запуске этого кода
Engr Rao Zaka
этот фильтр не 7х7?
Jiggunjer

Ответы:

1

Ваш код верен и результаты соответствуют. Вы можете быть удивлены ими из-за некоторых «скрытых функций».

Во-первых, conv2по умолчанию возвращает полную свертку, так что в результате получается размер изображения плюс граница, равная половине размера ядра (то есть общий размер, если размер изображения плюс размер ядра). Когда вы интерпретируете свои результаты, знайте об этом!

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

Последнее, imagescпо умолчанию масштабирует шкалу между самым высоким и самым низким коэффициентом. Вот почему в крайнем левом результате вы видите в основном границу.

Существуют различные варианты conv2описаны в help conv2которые позволяют управлять этим поведением.

Учтите также, что существует множество различных определений ядер для определения ребер, таких как log-Gabors.

разные типы фильтров,

Если вы заинтересованы в полной реализации (на python), вы можете взглянуть на: https://pythonhosted.org/LogGabor/ (бесстыдная самостоятельная вставка 😇).

meduz
источник
0

Ваш код правильный. Вам просто нужно выполнить двумерную свертку с ядром фильтра, что вы делаете очень хорошо.

Удачи

Уджвал Арийский
источник
Я не могу тебя понять. Вы делаете 2-D Convolution (как вы используете функцию conv2). Другой способ заключается в умножении в частотной области (поскольку свертка во временной или пространственной области эквивалентна умножению в частотной области). Однако вам не нужно этого делать, поскольку conv2, по сути, делает то же самое (внутренне !!!)
Ujjwal Aryan
Точно :) ,, вы знаете модель HMAX? (слои S1, C1, S2, C2 ...). Сейчас я пытаюсь вычислить слой C1 (максимальная операция между единицами S1), знаете ли вы некоторые идеи по этому поводу (код Matlab)?
Лист