Я пытаюсь использовать фильтрацию Винера для размытия не в фокусе изображения.Мое заявление чисто академическое, поэтому мне не нужен идеальный результат.Однако я сталкиваюсь с некоторыми странными проблемами и не уверен, правильно ли я все делаю.
Для начала я установил камеру и сделал два набора снимков.Первый набор изображений был в фокусе.Я начал с того, что сфотографировал очень маленький светодиод в полностью затемненной комнате.Затем я положил лист бумаги прямо перед светодиодом (который теперь был выключен) и сделал снимок, используя вспышку.Теперь я расфокусировал камеру и таким же образом сделал еще один набор изображений.
Насколько я понимаю, фотография сфокусированного источника света является экспериментально измеренной функцией рассеяния точки.Таким образом, я подумал, что было бы легко удалить размытое изображение не в фокусе, используя обратную фильтрацию.Что ж, получается, что все было не так просто (см. Предыдущий пост ).Так что теперь я пытаюсь реализовать фильтр Винера, и мне не очень повезло.Здесь моя программа до сих пор.Я установил два ползунка для изменения значений kernel_size
и restoration_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
Если это полезно, вот изображение не в фокусе (текст) и светодиод не в фокусе (что я считаю экспериментальной функцией рассеяния точки).