【问题标题】:Am I using Numpy to calculate the Inverse Filter correctly?我是否使用 Numpy 正确计算逆滤波器?
【发布时间】:2011-12-15 04:44:47
【问题描述】:

作为数字图像处理课程的一部分,我们被分配了用于图像恢复的逆滤波器。我正在使用 numpy.下面的变量名称尝试遵循 数字图像处理 Gonzalez+Woods, 3e 中的名称。

原始图像的缩放。 .

高斯核“zz.tif”与原始图像大小相同。

没有添加噪声的高斯平滑图像的缩放

f = imtools.load_image( sys.argv[1], mode="L", dtype="float" )
zz = imtools.load_image( "zz.tif", mode="L", dtype="float" )

F = np.fft.fft2( f )
F2 = np.fft.fftshift( F )

# normalize to [0,1]
H = zz/255.

# calculate the damaged image
G = H * F2

# Inverse Filter 
F_hat = G / H

# cheat? replace division by zero (NaN) with zeroes
a = np.nan_to_num(F_hat)
f_hat = np.fft.ifft2( np.fft.ifftshift(a) )

imtools.save_image( np.abs(f_hat), "out.tif" )

imtools 只是我使用 PIL+numpy 加载/存储图像的包装器。 (也可以发布那个src。)

逆滤波图像的缩放。

我是否正确计算了逆滤波器?我是否正确使用了 numpy?

最终图像中的铃声是预期的还是我做错了什么?

【问题讨论】:

  • 代码是否产生了预期的结果?你把它交给评分了吗?
  • 我还没有提交评分(截止日期为 11 月 2 日)。我想知道我是否做对了,得到了反向过滤器的预期图像。

标签: python image-processing numpy


【解决方案1】:

一般来说,是的,据我所知,您似乎做事正确。

振铃是由于高通滤波器过于“尖锐”,但这就是您使用的方法的作用。

但是,您可能会考虑使用numpy.fft.rfft2(“real fft”)和numpy.fft.irfft2 而不是numpy.fft.fft2numpy.fft.ifft2,因为您处理的是纯粹的实际值。应该会快一些。

【讨论】:

  • 谢谢!我将不得不了解更多关于 rfft2() 的信息。它返回 (2048,1025) 而不是 (2048x2048) 像 fft2() 那样。
【解决方案2】:

我对 Python 了解不多,但“振铃”对于逆过滤器来说是正常的。 Gibbs phenomenon 是响铃的基础。由于输入不是完全平滑的,而是有一些不连续性,因此原则上需要无限数量的傅立叶分量来完全表示它。有限数量的组件在这里就足够了,因为显示分辨率是有限的,图像是像素化的。然而,由于在 H 中与零相乘,记录图像中的一些信息丢失了,因此恢复的图像接近输入图像,其分量覆盖了有限带宽,低于显示器的带宽,揭示了吉布斯振荡。

为了缓解这种情况,请使用适当的正则化,如 2D Wiener 滤波器:F_hat=G * H.conjugate()/(abs(H)2+NSR2) 其中 NSR 是信噪比,例如在最高空间频率下从 0 线性增加到 10。这将解释有限的信噪比,当 NSR 估计值足够接近时,您应该在恢复后看到很少的“振铃”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    相关资源
    最近更新 更多