我想知道如何在图像处理中获得空间1维和2维锐化滤波器的光谱。
锐化滤镜是:
[-1, 3, -1];
[-1, -1, -1; -1, 8, -1; -1, -1, -1];
在MATLAB中,我该怎么做才能获得滤波器的频谱,或者如何获得这些滤波器的频率成分?
答案 0 :(得分:7)
您可以使用Luis Mendo的帖子立即确定过滤器的频谱。使用freqz
表示1D滤镜,或freqz2
表示2D滤镜。请注意,使用freqz
和freqz2
的图表是在[-1,1]
之间跨越的归一化频率。
但是,我想写这篇文章来赞美路易斯·门多,并向你展示 光谱的来源。
让我们从您的第一个过滤器开始:
h1 = [-1,3,-1];
如果您还记得,1D Discrete-Time Fourier Transform (DTFT)定义为:
请特别注意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
生成从-pi
到pi
的线性增加数组,范围之间有100个点。您可以通过指定手动告诉linspace
要生成多少点的第三个参数来覆盖此行为,但如果省略此参数,则默认值为100.
请注意,我已经使y
- 轴从0延伸,因此您可以看到曲线从哪里开始并且最多可以达到5,因为这是{{{}的最大值。 1}}。这就是我们得到的:
实际上,上述频谱看起来确实像高通滤波器,并且因为DC频率(h
)的幅度为1,所以基本上是在高通滤波结果的基础上添加原始信号因此,#锐化"你的信号。
你可以对2D情况进行相同的处理,尽管它会涉及更多。在2D情况下,离散时间傅里叶变换被定义为:
我们有两个独立的变量要考虑,我们将有2D空间频率。 w = 0
和w1
将沿着2D信号的行运行,而k1
和w2
将沿列运行> 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');
w1
和w2
提供在阵列的每个相应空间位置水平和垂直定义的频率的唯一组合。 w1
和w2
实际上是二维的。对于w1
和w2
的每个唯一组合,我们确定光谱的大小。一旦我们计算了这些,我们就可以将所有这些信息放在一个漂亮的三维表面图中。
我们得到:
请注意,这两个维度都来自[-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
频率轴通常标准化为采样频率的一半。
有关更多选项,请参阅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)
频率轴标准化为采样频率的一半,如1D情况。
有关更多选项,请参阅documentation of freqz2
。