2D Gabor小波在图像上的应用

时间:2018-04-22 20:00:55

标签: matlab image-processing

编辑:这是我使用的代码生成边缘检测到的图像:

cookiesImage = rgb2gray(imread('Cookies.png'));
width = 45;
height = 45;
KMAX = pi / 2;
f = sqrt(2);
delta = pi / 3;

output = zeros(size(cookiesImage, 1), size(cookiesImage, 2), 8);


for i = 0 : 7
wavelets = GaborWavelet(width, height, KMAX, f, i, 2, delta);
figure(1);
subplot(1, 8, i + 1), imshow(real(wavelets), []);
output(:, :, i + 1) = imfilter(cookiesImage, wavelets, 'symmetric');
end

display = sum(abs(output).^2, 3).^0.5;
display = display./max(display(:));
figure(2); imshow(display);


 function GWKernel = GaborWavelet (width, height, KMAX, f, u , v,  delta)
delta2 = delta * delta;
kv = KMAX / (f^v);
thetaU = (u * pi) / 8;
kuv = kv * exp (1i * thetaU);
kuv2 = abs(kuv)^2;

GWKernel = zeros (height, width);
for y =  -height/ 2 + 1 : height / 2
    for x = -width / 2 + 1 : width / 2
        GWKernel(y + height / 2, x + width / 2) = (kuv2 / delta2) * exp(-0.5 * kuv2 * (x * x + y * y) / delta2) * (exp(1i * (real(kuv) * y + imag (kuv) * x )) - exp (-0.5 * delta2));
    end
end

这是我用于Wavelets的功能,这就是我尝试应用它们的方法,但我得到的只是检测到边缘的图像,而不是this link中的一个。

1 个答案:

答案 0 :(得分:0)

运行代码,我看到生成了以下小波:

enter image description here

这看起来很像旋转的二阶导数。这只是Gabor滤波器内核的真实(偶数)组件。虚构(奇数)对应物看起来像是一阶导数。

这就是为什么您觉得您的结果就像边缘检测到的图像一样。它有点像。

尝试增加过滤器的尺寸(不是尺寸width x height,而是确定信封尺寸的delta。这将使您看到形成Gabor内核的大部分正弦波。

接下来,您显示的结果图像是各个Gabor滤波器的平方幅度之和。尝试显示其中一个过滤结果的实部或虚部,您会发现它看起来更像您期望:

imshow(real(output(:,:,3)),[])

我不熟悉Gabor内核的这种参数化,但请注意它有一个高斯包络。因此,内核的足迹(widthheight)可以调整为此高斯的大小(似乎使用delta作为西格玛)。我通常建议对高斯内核使用2*ceil(3*sigma)+1的内核覆盖区。这同样适用于此:

width = 2*ceil(3*delta)+1;
height = width;

这将加速计算,正如您在内核图片中看到的那样,内核中有很多接近零的值,可以将它们裁剪为更小的尺寸而不会影响输出。

使用矢量化也可以简化GaborWavelet函数:

function GWKernel = GaborWavelet (width, height, KMAX, f, u , v,  delta)
delta2 = delta * delta;
kv = KMAX / (f^v);
thetaU = (u * pi) / 8;
kuv = kv * exp (1i * thetaU);
kuv2 = abs(kuv)^2;

x = -width/2 + 1 : width/2;
[x,y] = meshgrid(x,x);
GWKernel = (kuv2 / delta2) * exp(-0.5 * kuv2 * (x .* x + y .* y) / delta2) ...
           .* (exp(1i * (real(kuv) * y + imag (kuv) * x )) - exp (-0.5 * delta2));