【问题标题】:why weiner filter reduces only noise in my case, it is not reducing blur amount为什么韦纳滤波器在我的情况下只减少噪音,它并没有减少模糊量
【发布时间】:2019-09-24 15:39:35
【问题描述】:

我正在 python 中实现 Weiner 过滤,它应用于使用磁盘形状点扩散函数模糊的图像,我包括制作磁盘形状 psf 和 Weiner 过滤器的代码


def weinerFiltering(kernel,K_const,image):
    #F(u,v)
    copy_img= np.copy(image)
    image_fft =np.fft.fft2(copy_img)
    #H(u,v)
    kernel_fft  = np.fft.fft2(kernel,s=copy_img.shape)
    #H_mag(u,v)
    kernel_fft_mag = np.abs(kernel_fft)
    #H*(u,v)
    kernel_conj = np.conj(kernel_fft)

    f = (kernel_conj)/(kernel_fft_mag**2 + K_const)
    return np.abs(np.fft.ifft2(image_fft*f))


def makeDiskShape(arr,radius,centrX,centrY):
    for i in range(centrX-radius,centrX+radius):
        for j in range(centrY-radius,centrY+radius):
            if(l2dist(centrX,centrY,i,j)<=radius):
                arr[i][j]=1
    return arr/np.sum(arr)


this is blurred and gaussian noised image

this is what i am getting result after weiner filtering for K value of 50 结果似乎不是很好,有人可以帮忙吗 似乎噪声减少了,但模糊量没有,盘形 psf 矩阵的形状为 20,20,半径为 9,看起来像 this

更新 使用地面实况图像和噪声的功率谱来计算 K 常数值,我仍然得到强烈的伪影 this is noised and blurred image

this is result after using power specturm in place of a constant K value

【问题讨论】:

  • 这家伙的名字是 Norbert Wiener,不是 Weiner...
  • @Piglet 感谢您提供有用的信息

标签: image-processing signal-processing


【解决方案1】:

降低K 的值。你需要玩弄它,直到你得到好的结果。如果它太大,它不会过滤,如果它太小,你会得到强伪影。

如果您了解噪声方差,则可以使用它来估计正则化参数。在维纳滤波器中,常数KN/S 的简化形式,其中N 是噪声功率,S 是信号功率。这两个值都与频率有关。信号功率S可以通过待滤波图像的自相关函数的傅里叶变换来估计。噪声功率很难估计,但如果你有这样的估计(或知道它,因为你综合地创建了噪声图像),那么你可以将该值代入方程。请注意,这是噪声功率,而不是噪声的方差。

以下代码使用DIPlib(我们称之为PyDIP的Python接口)来演示Wiener反卷积(免责声明:我是作者)。我认为将这段代码转换为使用其他库并不难。

import PyDIP as dip

image = dip.ImageRead('trui.ics');
kernel = dip.CreateGauss([3,3]).Pad(image.Sizes())

smooth = dip.ConvolveFT(image, kernel)
smooth = dip.GaussianNoise(smooth, 5.0)  # variance = 5.0

H = dip.FourierTransform(kernel)
F = dip.FourierTransform(smooth)
S = dip.SquareModulus(F)  # signal power estimate
N = dip.Image(5.0 * smooth.NumberOfPixels())  # noise power (has same value at all frequencies)

Hinv = dip.Conjugate(H) / ( dip.SquareModulus(H) + N / S )

out = dip.FourierTransform(F * Hinv, {"inverse", "real"})

smooth 图像如下所示:

对上面的图像进行反卷积得到的out 图像如下所示:

不要期望完美的结果。正则化项阻碍了完美的逆滤波,因为这种滤波会强烈地增强噪声,以至于它会淹没信号并产生完全无用的输出。维纳滤波器在取消卷积和抑制噪声之间找到了一个中间地带。

WienerDeconvolution 的 DIPlib 文档解释了一些涉及的方程式。

【讨论】:

  • 是的,这就是我现在面临的问题,但是你如何真正获得 K 值的良好近似值,因为它是噪声功率谱和地面实况图像的比率(即 |F(u ,v)|),因为现在我确实有原始图片,所以如果我这样做可以获得两个功率谱的比率(不假设公式中的恒定值),我仍然会在图像中得到强烈的伪影,为什么会这样?
  • @Bunny:原图并没有告诉你噪点是多少。你需要猜测。
  • 是的,我明白..实际上我正在玩图像,我有一个没有任何噪音的原始图像..我用点扩散函数对其进行卷积以使其模糊,所以我有真正的 H(u, v) 我给它添加了高斯噪声所以现在我有 N(u,v)
  • @Bunny:请参阅我的编辑,了解如何正确考虑已知的噪声功率。使用方程中的实际噪声没有用,您只需要它的统计信息。
猜你喜欢
  • 2017-09-10
  • 2016-10-02
  • 2011-06-10
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
相关资源
最近更新 更多