如何将低通高斯滤波器转换为高通滤波器

信息处理 图像处理 matlab 低通滤波器 高斯 高通滤波器
2022-02-15 19:39:18

我有以下代码用于将高斯滤波器应用于图像。据我了解,这是一个低通滤波器。现在我必须将其转换为高通滤波器,根据我们从指令中得知的内容,高斯低通滤波器和高通滤波器之间的一个区别是,对于高通,滤波器内核中元素的总和应该加起来为零,而不是像低通滤波器那样加起来。我该怎么做呢?

%%horizontal and vertical coordinates
coordinates = -floor(N/2) : floor(N/2);
[X Y] = meshgrid(coordinates, coordinates);
N = 12; 
sigma=2;

gfilter = exp(-(X.^2 + Y.^2)/(2*sigma.^2));
gfilter = gfilter/sum(gfilter(:));

I = mean(double(imread('image.png')),3);
GaussBlur = conv2(I,gfilter);
%%plot images side by side
subplot(1,2,1);
imshow(I, []);
subplot(1,2,2);
imshow(GaussBlur, []);
1个回答

最简单的选择是从数据中去除低通信号。只需从原始图像中减去代码的结果。这相当于计算:

Ihigh=δIgI=(δg)I.

术语δI对应于图像的狄拉克增量的卷积,这是一个不变的操作。作为系数的总和δ过滤器是一个,比如g,得到的过滤器δg有一个零和。 但警告:系数总和为 1 的滤波器不一定是高通滤波器。它是低切的,例如可以是带通的。

一个更有说服力的方法是使用调制属性:您可以通过交替将低通滤波器的系数逐点相乘11(这里讨论了交替符号:为什么掩码的总和应该是一?)。以下代码在一维中执行此操作:

b = [1 4 6 4 1];b=b/sum(b) ;a=1;
c = b.* (-1).^(1:length(b)); 
[hb,w] = freqz(b,a,1024);
[hc,w] = freqz(c,a,1024);
figure(1);plot(w,abs([hb,(hc)]));axis tight

在一维中过滤低通到高通

2D 中的适配如下:

在 2D 中过滤低通到高通

N =13;
%%horizontal and vertical coordinates
coordinates = -floor(N/2) : floor(N/2);
[X Y] = meshgrid(coordinates, coordinates);
sigma=2;

gfilter = exp(-(X.^2 + Y.^2)/(2*sigma.^2));
gfilter = gfilter/sum(gfilter(:));

gridInv = (-1).^(X+Y);
hfilter = gfilter.*gridInv;

subplot(2,2,1);
mesh(gfilter);
subplot(2,2,2);
mesh(hfilter);

subplot(2,2,3);
imagesc(abs(fftshift(fft2(gfilter))));
subplot(2,2,4);
imagesc(abs(fftshift(fft2(hfilter))));