我正在Python中实现韦纳过滤,该过滤应用于使用磁盘形状点扩散函数模糊的图像,我包括制作磁盘形状psf和韦纳过滤器的代码
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)
结果似乎不太好,有人可以帮忙吗 似乎噪声减少了,但模糊量却没有减少,圆盘形 psf 矩阵的形状是 20,20,半径是 9,看起来像
降低您的
K
值。您需要不断尝试,直到获得良好的结果。如果太大,则不会过滤,如果太小,则会出现强烈的伪影。
如果您了解噪声方差,则可以使用它来估计正则化参数。在维纳滤波器中,常数
K
是N/S
的简化,其中N
是噪声功率,S
是信号功率。这两个值都与频率相关。信号功率S
可以通过待滤波图像的自相关函数的傅里叶变换来估计。噪声功率很难估计,但如果您有这样的估计(或者因为您综合创建了噪声图像而知道它),那么您可以将该值代入方程中。请注意,这是噪声功率,而不是噪声的方差。
以下代码使用 DIPlib(我们称为 PyDIP 的 Python 接口)来演示维纳反卷积(免责声明:我是作者)。我认为将此代码转换为使用其他库并不困难。
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 文档解释了所涉及的一些方程。