Wiener滤镜,用于Python失焦图像

时间:2018-12-14 14:56:02

标签: python image-processing filtering deconvolution

我正在尝试使用维纳滤波来模糊散焦图像。我的申请纯粹是学术性的,因此不需要完美的结果。但是,我遇到了一些奇怪的问题,不确定是否做得正确。

首先,我安装了相机并拍摄了两组图像。第一组图像聚焦。我首先在一个完全昏暗的房间里拍摄了一个非常小的LED的照片。然后,我将一张纸直接放在LED前面(现已熄灭),并使用闪光灯拍照。现在,我将相机散焦,并以相同的方式拍摄另一组图像。

我的理解是,失焦点光源的照片是实验测量的点扩散函数。因此,我认为使用逆滤波对散焦图像进行模糊处理很容易。好吧,事实证明,这毕竟不是那么容易(请参阅前面的post)。因此,现在我正在尝试实现维纳过滤器,而且运气不佳。到目前为止,这是我的程序。我设置了两个滑块来更改kernel_sizerestoration_parameter的值,而不必重新运行程序。

import numpy as np
import matplotlib.pyplot as plt
import ipywidgets as widgets
import cv2

kernel_size = 5
restoration_parameter = 1

# Read in images: out-of-focus, in-focus, and experimental point spread function
img = cv2.imread('pictures/out_of_focus.jpg')
blur = img[:,:,0]
img2 = cv2.imread('pictures/in_focus.jpg')
clean = img2[:,:,0]
img = cv2.imread('pictures/PSF.jpg')
psf1 = img[:,:,0]

psf2 = np.ones((kernel_size, kernel_size)) / kernel_size**2  # A square kernal
psf = psf2  # set psf to be either psf1 (experimental point spread function) or psf2 (square kernal)
deconvolved_img = restoration.wiener(blur, psf, restoration_parameter, clip=False)

fig = plt.figure()
ax = plt.subplot(111)
new_image = ax.imshow(deconvolved_img)
plt.gray()
plt.show()

def update(kernel_size, restoration_parameter):
    psf2 = np.ones((kernel_size, kernel_size)) / kernel_size**2
    psf = psf2  # set psf to be either psf1
    deconvolved_img = restoration.wiener(blur, psf, restoration_parameter, clip=False)
    new_image.set_data(deconvolved_img)
    ax.set_title(r'kernel size = %2.0f, restoration parameter =%2.5f' % (kernel_size, restoration_parameter))
    return

widgets.interact(update, restoration_parameter=widgets.FloatSlider(min=0,max=100,step=0.1,value=epsilon,description=r'Res. Par.'),
                kernel_size=widgets.IntSlider(min=0,max=40,step=1,value=kernel_size,description=r'kernel size'))

如果将psf设置为psf1,则程序将使用实验测量的点扩展函数。在这种情况下,不使用kernel_size参数。令我惊讶的是,未模糊的图像看起来像是杂讯,没有任何我期望看到的图像的提示。这让我很困惑,因为我认为这是我正在处理的系统的实验获得的点扩散函数,因此应该是一个不错的起点。显然,我一定弄错了(我也误认为反向过滤会起作用)。如果有人可以向我解释为什么这根本不起作用,将不胜感激。

如果将psf设置为psf2,则程序将使用大小为kernel_size的平方核。在这种情况下,去模糊的图像确实类似于我的期望,但是最终图像仍然完全模糊,并且似乎没有一组参数可以帮助您。我想我并不感到惊讶,因为这种情况下的点扩散函数似乎并不能很好地逼近真实的点扩散函数,因此效果并不很好。但是令我惊讶的是,它比使用实验测量的点扩散函数更好。这使我感到自己可能做错了事。

无论如何,我希望有人可以教育我做错了什么(如果有的话),并指出可能导致成功的方向。顺便说一下,尽管我有对焦图像供参考,但我不想在计算中使用它。我正在尝试演示一个真实的场景,其中您可能拍摄了失焦的照片,并且想要在不获取对焦图像的情况下进行修复。

aTdHvAaNnKcSe

如果有帮助,这里有离焦图像(文本)和离焦LED(我认为这是实验点扩展功能)。

Out-of-focus image

Point spread function

0 个答案:

没有答案