数字图像处理——高斯滤波器与零填充避免DFT固有周期性影响
2019.10.24 更新,与数字图像处理——频率域平滑锐化图像常用滤波器中滤波器公式保持一致,并更新填充函数的写法。
高斯滤波
高斯高通滤波 GaussianHPF
频率域高斯高通滤波公式如下,注意公式\(D\)和\(D_0\)的区别
\[H(u,v) = 1-e^{\dfrac{-D^2(u,v)}{2D_0^2}}\]
高斯低通滤波 GaussianLPF
频率域高斯低通滤波公式如下
\[H(u,v) = e^{\dfrac{-D^2(u,v)}{2D_0^2}}\]
1 |
|
DFT 固有周期影响
实现方法,由于 numpy.fft.fft2 方法参数中可以指定输出图像的大小,官方描述如下:
s : sequence of ints, optional
Shape (length of each transformed axis) of the output (s[0] refers to axis 0, s[1] to axis 1, etc.). This corresponds to n for fft(x, n). Along each axis, if the given shape is smaller than that of the input, the input is cropped. If it is larger, the input is padded with zeros. if s is not given, the shape of the input along the axes specified by axes is used.
该参数默认为 DFT 变换后大小为原图大小,若指定输出大小大于原图大小,则进行 0 填充,我们可以利用该参数实现我们的测试。
不经填充裁剪
直接以 s 的默认值(None)调用 numpy.fft.fft2 实际上就是进行的非 0 填充
调用我之前写的方法,实现如下
1 |
|
或者如下
1 |
|
进行填充裁剪
根据教材 P157 解释以及 P159、P163 页,二维零填充避免缠绕错误的结论与一维相同,令\(f(x)\)和\(h(x)\)分别是大小为\(A \times B\)和\(C \times D\)像素的图像阵列。循环卷积中的缠绕错误可以通过下面函数进行零填充来避免,方法如下:
\[ f_p(x,y)=\left \{ \begin{aligned} f(x,y) & , & 0 \le x \le A-1 和 0 \le y\le B-1 \\ 0 & , & A \le x \le P 或 B \le y \le Q \end{aligned} \right. \]
和
\[ h_p(x,y)=\left \{ \begin{aligned} h(x,y) & , & 0 \le x \le C-1 和 0 \le y\le D-1 \\ 0 & , & C \le x \le P 或 D \le y \le Q \end{aligned} \right. \]
其中,
\[ P \ge A+C -1 \] 和 \[ Q \ge B+D-1 \]
那么实现方法就有两种:
- 通过其他方法进行补 0 后调用 s 为 None 的 DFT
- 通过调整 s 为(P,Q)大小调用 DFT
填充的代码实现:
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
上述实验证明了 DFT 固有周期带来的一些影响,未进行零填充的 Original Img 由于固有周期亮色部分左右仍旧是亮色部分,所以使滤波器丧失了能力,在一些情况下我们希望避免这种固有周期带来的影响,因而才引入了零填充的方式。
正如课本 P163 以及 P164 所讲:
用 0 填充图像后,在周期序列的周围建立了一个平坦的边界。
从这个例子可以看到,错误地填充一幅图像会导致错误的结果。
当然,这种错误只存在于“ 边界”
如果滤波的目的仅是粗糙的视觉分析,那么有时可以跳过填充步骤。
根据两种方式 Padding 得到的最终裁减后图像的比较(All True),也证明了我使用的两种方法,Method 1:手动填充 0 金和 Method 2:利用numpy.fft.fft2()
中自动 0 填充的方式确实都得到了相同的结果。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!