将Gabor滤镜应用于输入图像


11

我尝试应用具有特定比例的Gabor滤波器(根据我的lambda和sigma的值,所以它是(7x7)并针对4个方向(0,ππ43ππ2)输入灰度图像。3π4

在我的代码中,实现了三个步骤:

  1. 创建Gabor过滤器

  2. 读取RGB图像,然后将其转换为灰度,最后转换为两倍。

  3. 将创建的gabor应用于输入图像(在这里,我不确定我的代码是否正确,这就是为什么我需要您的意见

1)--------------创建Gabor滤镜(大小= 7x7和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,请与“ same”选项一起使用。
Tolga Birdal 2014年

错误:文件:practise1.m行:3列:7等号左侧的表达式不是分配的有效目标。运行此代码时,我发现此错误
Engr Rao Zaka

这个滤镜不是7x7吗?
jiggunjer

Answers:


1

您的代码正确且结果一致。由于某些“隐藏功能”,您可能会对它们感到惊讶。

首先, conv2默认情况下返回完整卷积,这样结果就是图像的大小加上边框的一半,即内核大小的一半(即,如果图像大小加上内核的总大小,则总大小)。解释结果时,请注意!

其次,结果表示的系数越强,内核与本地图像补丁之间的相关性越高:正如您所期望的,您还提取了图像的边界。特别要注意的是,最左边的结果显示出很强的垂直线。

最后,imagesc默认情况下缩放比例介于最高系数和最低系数之间。这就是为什么在最左边的结果中,您主要看到边框的原因。

conv2描述的不同选项help conv2允许控制此行为。

还应注意,用于检测边缘的内核有许多不同的定义,例如log-Gabors

不同类型的过滤器

如果您对完整的实现感兴趣(使用python),则可以查看:https : //pythonhosted.org/LogGabor/(无耻的自插😇)。


0

您的代码是正确的。您只需要使用做得很好的过滤器内核进行二维卷积即可。

祝好运


我无法理解你。您正在执行二维卷积(就像使用conv2函数一样)。另一种方法是在频域中进行乘法(因为在时域或空域中的卷积等效于频域中的乘法)。但是,您不必这样做,因为conv2本质上是做相同的事情(内部!!)
Ujjwal Aryan

正是:),您知道HMAX模型吗?(S1,C1,S2,C2层...)。我现在正在尝试计算C1层(S1单元之间的最大操作),您知道一些有关此的想法(matlab代码)吗?
李斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.