Фильтр Винера для не в фокусе изображения в Python - PullRequest
0 голосов
/ 14 декабря 2018

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

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

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

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

Out-of-focus image

Point spread function

...