将 Gabor 过滤器应用于输入图像

信息处理 图像处理 matlab 过滤器 卷积 物体识别
2022-01-07 10:56:10

我尝试应用具有特定比例的 Gabor 过滤器(根据我的 lambda 和 sigma 值,所以它是(7x7)和4 个方向(0,π4,π23π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=....');

在此处输入图像描述

2个回答

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

首先, conv2默认返回全卷积,结果是图像大小加上内核大小一半的边框(即图像大小加上内核大小的总大小)。当您解释结果时,请注意它!

其次,结果代表的系数对于内核和本地图像补丁之间的更高相关性更强:正如预期的那样,您还提取了图像的边界。尤其看你最左边的结果,显示出强烈的垂直线。

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

有不同的选项要conv2描述,help conv2其中允许控制此行为。

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

不同类型的过滤器.

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

你的代码是正确的。您只需要使用您做得很好的过滤器内核进行 2-D 卷积。

祝你好运