Фильтр Винера для не в фокусе изображения в Python

Я пытаюсь использовать фильтрацию Винера для размытия не в фокусе изображения. Мое заявление чисто академическое, поэтому мне не нужен идеальный результат. Однако я сталкиваюсь с некоторыми странными проблемами и не уверен, что делаю все правильно.

Для начала я установил камеру и сделал два набора снимков. Первый набор изображений был в фокусе. Я начал с того, что сфотографировал очень маленький светодиод в полностью затемненной комнате. Затем я положил лист бумаги прямо перед светодиодом (который теперь был выключен) и сделал снимок, используя вспышку. Теперь я расфокусировал камеру и таким же образом сделал еще один набор изображений.

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

В случае, если это полезно, вот изображение не в фокусе (текст) и светодиод не в фокусе (то, что я считаю экспериментальной функцией рассеяния точки).

0 ответов

Другие вопросы по тегам