这是一个简短问题的长答案。如果您想学习一些东西,请阅读它。
低通滤波器和高通滤波器都是线性滤波器。
线性滤波器可以通过卷积在空间域中应用,也可以在频域(也称为傅里叶域)中作为乘法应用。
确实,在傅里叶域中,低通滤波器内核和恒等滤波器(全通滤波器)的区别在于高通滤波器:
high_pass_filter = identity_filter - low_pass_filter
身份过滤器将是一个内核,其中每个元素都是 1。过滤器通过乘法应用,所以
IM2 * high_pass_filter = IM2 * ( identity_filter - low_pass_filter )
与
相同
IM2 * high_pass_filter = IM2 - IM2 * low_pass_filter
(这里,和问题一样,IM2 是图像im2 的傅立叶域表示;所有带有黄色边框的东西都是方程式,但都是用伪代码编写的,@ 987654329@ 用于乘法的符号)。
因此,OP 想要应用低通滤波器并在傅里叶域中减去输入图像以获得高通滤波图像。
但是,properties of the Fourier transform 之一是它是线性变换。这意味着
F(a*f + b*g) == a * F(f) + b * F(g)
(使用F(.) 傅里叶变换、a 和b 常量,以及f 和g 函数)。设置a=1和b=-1,g低通滤波图像和f输入图像,我们得到
F(im2 - im2_low) == F(im2) - F(im2_low)
也就是说,空间域和傅里叶域的减法是等价的。因此,如果在空间域中计算im2_low,则无需去傅里叶域进行减法。这两位代码产生相同的结果(达到数值精度):
F = fft2(im2_low);
IM2 = fft2(im2);
IM2_high = IM2 - F;
im2_high = ifft2(IM2_high);
im2_high = im2 - im2_low;
此外,卷积也是线性的。这意味着,如果您将上述等式中的F(.) 视为卷积,那么这些等式仍然成立。你可以做这样的操作:
conv(f, h) - f == conv(f, h) - conv(f, 1) == conv(f, h-1)
这直接导致了空间域中高通滤波器的定义:
g = - compute_kernel(9,101);
g(51,51) = g(51,51) + 1;
im2_high2 = conv2(im2,g,'same');
您会看到max(max(abs(im2_high-im2_high2))) 产生的值非常接近于 0。
关于计算高斯滤波器的说明:
问题中发布的compute_kernel 函数通过直接评估二维高斯来计算二维滤波器内核。生成的过滤器内核为 101x101 像素,这意味着计算卷积需要 101 * 101 * N 乘法和加法 (MAD),N 是过滤后图像中的像素数。但是,高斯滤波器是可分离的,这意味着只能在 101 * 2 * N MAD 中获得相同的结果(少 50 倍!)。此外,对于sigma = 9,也可以使用更小的内核。
-
高斯核大小:
高斯函数永远不会达到零,但它会很快达到非常接近零的值。在3*sigma 切断它时,几乎没有丢失。我发现 3 sigma 是一个很好的平衡。在 sigma = 9 的情况下,3 sigma 截止导致内核具有 55 个像素 (3*sigma * 2 + 1)。
-
高斯可分性:
多维高斯可以通过一维高斯相乘得到:
exp(-(y.^2+x.^2)/(2*sigma*sigma)) == exp(-(x.^2)/(2*sigma*sigma)) * exp(-(y.^2)/(2*sigma*sigma))
这导致卷积的实现更加高效:
conv(f,h1*h2) == conv( conv(f,h1), h2 )
也就是说,使用列过滤器h1 对图像进行卷积,然后使用行过滤器h2 对结果进行卷积与使用二维过滤器h1*h2 对图像进行卷积相同。在代码中:
sigma = 9;
sizei = ceil(3*sigma); % 3 sigma cutoff
g = exp(-(-sizei:sizei).^2/(2*sigma.^2)); % 1D Gaussian kernel
g = g/sum(g(:)); % normalize kernel
im2_low = conv2(g,g,im2,'same');
g2d = g' * g;
im2_low2 = conv2(im2,g2d,'same');
区别在于数值不精确:
max(max(abs(im2_low-im2_low2)))
ans =
1.3927e-12
您可以在我的博客上找到a more detailed description about Gaussian filtering,以及some issues you can run into when using MATLAB's Image Processing Toolbox。