如何获得图像中使用的一维和二维空间滤波器的光谱?

时间:2015-02-04 15:19:46

标签: matlab image-processing filter signal-processing

我想知道如何在图像处理中获得空间1维和2维锐化滤波器的光谱。

锐化滤镜是:

[-1, 3, -1];
[-1, -1, -1; -1, 8, -1; -1, -1, -1];

在MATLAB中,我该怎么做才能获得滤波器的频谱,或者如何获得这些滤波器的频率成分?

2 个答案:

答案 0 :(得分:7)

您可以使用Luis Mendo的帖子立即确定过滤器的频谱。使用freqz表示1D滤镜,或freqz2表示2D滤镜。请注意,使用freqzfreqz2的图表是在[-1,1]之间跨越的归一化频率。

但是,我想写这篇文章来赞美路易斯·门多,并向你展示 光谱的来源。


让我们从您的第一个过滤器开始:

h1 = [-1,3,-1];

如果您还记得,1D Discrete-Time Fourier Transform (DTFT)定义为:


旁白:为什么DTFT而不是离散傅立叶变换(DFT)?

请特别注意Discrete Fourier Transform (DFT)不同。它们之间的区别在于DTFT是应用于离散信号的传统傅立叶变换。从连续的角度来看,我们应用常规傅立叶变换,其中频谱在频率方面是连续的。对于离散信号,这里基本上是相同的,但是变换应用于离散信号。输出的频率也是连续的,附加约束是频谱为2*pi周期性的。对于DFT,它本质上是DTFT 在频域中的采样版本。因此,它们之间的核心差异在于频域中,一个是连续的,而另一个是连续对应的采样版本。我们需要对DTFT进行采样的原因是,您可以将光谱实际存储在计算机上,让程序处理光谱(即MATLAB)。

您的问题要求确定频谱是什么,从理论角度来看,我将向您展示DTFT。当我们实际绘制光谱时,无论如何我们实际上采样 DTFT,所以当我们看到光谱时,您将可视化DFT(或多或少!)。 / p>

可以在DSP StackExchange上找到关于它们之间差异的非常好的解释:https://dsp.stackexchange.com/questions/16586/difference-between-discrete-time-fourier-transform-and-discrete-fourier-transfor


回到你的问题

对于DTFT的定义,h[k]是1D信号,omega是以弧度定义的角频率。因此,您可以将滤波器视为此1D信号,当您在空间域中进行滤波时,它与获取此信号相同,将其转换为频域并与频域中的其他输入信号进行乘法运算。

因此,如果我们认为您的过滤器是对称的,则将值3定义为中心点。因此,您可以将h[k]视为:

h = [-1    3  -1]
      ^    ^   ^
k =   -1   0   1

因此,频域表示仅仅是具有复指数项的滤波器系数的加权和。将h[k]替换为傅里叶变换公式,我们得到:

如果您还记得Euler's formula,我们有:

类似地:

如果我们将两个方程式加在一起,我们可以重新排列并求解cos(x)

回到我们的1D滤波器的变换,我们可以做一些因子分析:

请注意,域名在[-pi,pi]之间,因为1D傅立叶变换是2*pi对称的。因此,如果要显示光谱,只需使用上面的域绘制并使用我刚刚创建的等式,绘制绝对值,因为光谱的幅度始终为正:

w = linspace(-pi,pi);
h = abs(3 - 2*cos(w));
plot(w,h);
title('Magnitude of 1D spectrum');
axis([-pi, pi, 0, 5]);

linspace生成从-pipi的线性增加数组,范围之间有100个点。您可以通过指定手动告诉linspace要生成多少点的第三个参数来覆盖此行为,但如果省略此参数,则默认值为100.

请注意,我已经使y - 轴从0延伸,因此您可以看到曲线从哪里开始并且最多可以达到5,因为这是{{{}的最大值。 1}}。这就是我们得到的:

enter image description here

实际上,上述频谱看起来确实像高通滤波器,并且因为DC频率(h)的幅度为1,所以基本上是在高通滤波结果的基础上添加原始信号因此,#锐化"你的信号。


你可以对2D情况进行相同的处理,尽管它会涉及更多。在2D情况下,离散时间傅里叶变换被定义为:

我们有两个独立的变量要考虑,我们将有2D空间频率。 w = 0w1将沿着2D信号的运行,而k1w2将沿运行> 2D信号。

鉴于你的面具:

k2

由于h2 = [-1 -1 -1; -1 8 -1; -1 -1 -1] 的形状是对称的,因此8的值将是位置h2。因此,当我们用上面的等式计算光谱时,我们得到:

我将为您省去简化的麻烦,但是做一些重新排列并使用欧拉的公式,我们得到:

请注意:

我使用上面的属性来简化。对于2D情况,我们将定义meshgrid个坐标,两个维度的(w1,w2) = (0,0)范围均为[-pi,pi],我们将在surf的曲面图上绘制此坐标。请记住使用过滤器的绝对值来显示幅度:

[w1,w2] = meshgrid(linspace(-pi,pi));
h = abs(8 - 2*cos(w1+w2) - 2*cos(w1) - 2*cos(w2) - 2*cos(w1-w2));
surf(w1,w2,h);
title('2D spectrum of filter');

w1w2提供在阵列的每个相应空间位置水平和垂直定义的频率的唯一组合。 w1w2实际上是二维的。对于w1w2的每个唯一组合,我们确定光谱的大小。一旦我们计算了这些,我们就可以将所有这些信息放在一个漂亮的三维表面图中。

我们得到:

enter image description here

请注意,这两个维度都来自[-pi,pi]。如果检查频谱,您将看到DC分量被取消为0,实际上是高通滤波器,而是锐化滤波器。请参阅下面的说明。


次要说明

顺便说一句,您的2D滤镜定义是2D锐化滤镜。它只是一个2D拉普拉斯算子,它是一个边缘检测,因此是一个高通滤波器。它只检测边缘。如果你想要正确地锐化图像,请确保在内核的中心中加1,所以你真正想要的是:

h2 = [-1 -1 -1; -1 9 -1; -1 -1 -1];

偏移量1将确保您保持原始信号不变,但也会在原始信号的顶部添加高通结果,从而锐化您的输入。

答案 1 :(得分:3)

要绘制1D FIR滤波器的频率响应,请使用freqz

h = [-1, 3, -1]; %// FIR impulse response
N = 128; %// number of frequency samples
freqz(h,1,N); %// "1" because the filter is not recursive

enter image description here

频率轴通常标准化为采样频率的一半。

有关更多选项,请参阅documentation of freqz


要绘制2D FIR滤波器的频率响应,请使用freqz2

h = [-1, -1, -1; -1, 8, -1; -1, -1, -1]; %// FIR impulse response (filter mask)
N = 128; %// number of frequency samples
freqz2(h,N,N)

enter image description here

频率轴标准化为采样频率的一半,如1D情况。

有关更多选项,请参阅documentation of freqz2