Обратный фильтр пространственно-свернутого изображения по сравнению с частотно-свернутым

Моему классу обработки изображений назначен проект по восстановлению изображений. Сейчас я работаю над обратным фильтром. изображение -> деградировать -> обратный фильтр -> восстановить изображение. Я использую простой коробчатый фильтр 5x5 для моей деградации.

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

Свертка в частотной и пространственной областях должна быть идентична. Моя единственная мысль, что я что-то не так делаю с ядром? Я использую коробчатый фильтр 5x5. Пространственная свертка делит конечный результат на np.sum (поле).Я пробовал нормализовать окно с помощью:

box = np.ones( 25 ).reshape( 5,5 ) / 25.0

, но получил тот же результат с обратным фильтром мусора.

Я также заметил, что свернутое по частоте изображение ("g_freq.png" из приведенного ниже кода) смещено, вероятно, из-за того, что FFT заполняет верхнюю и левую границы нижним и правым краями изображения. Может ли это быть причиной проблемы?

Пространственная свертка: spatial convolition

Свертка частоты: обратите внимание на отступы вверху / слева. frequency convolution

Ниже приведен простейший возможный код для создания проблемы. 100% numpy / scipy / matplotlib.

import sys
import matplotlib
matplotlib.use( 'Agg' )
import matplotlib.pyplot as plt
import numpy as np
import scipy
from scipy import ndimage

def save_image( data, filename ) : 
    print "saving",filename
    plt.cla()
    fig = plt.figure()
    ax = fig.add_subplot( 111 )
    ax.imshow( data, interpolation="nearest", cmap=matplotlib.cm.gray )
    fig.savefig( filename )

f = scipy.misc.lena()
save_image( f, "scipylena.png" )

# create a simple box filter
kernel = np.ones( 25 ).reshape( 5, 5 ) 
kernel_padded = np.zeros_like(f,dtype="float")
# put kernel into upper left
kernel_padded[:5,:5] = kernel 

# FFT kernel, save as image
K = np.fft.fftshift( np.fft.fft2( kernel_padded ) )  
save_image( np.abs(K), "K.png" )


# degrade image via spatial convolution
g = ndimage.convolve( f, kernel )
if np.sum(kernel) != 0 :
    g /= np.sum(kernel)
# save spatial image
save_image( g, "g_spatial.png" )

# take convolved image into frequency domain
G = np.fft.fftshift( np.fft.fft2( g ) )

# inverse filter the spatially convolved image
F_HAT = G / K

# back to spatial, save the reconstructed image 
a = np.nan_to_num( F_HAT )
f_hat = np.fft.ifft2( np.fft.ifftshift( F_HAT ) )  
save_image( np.abs( f_hat ), "f_hat_spatial.png" )

# 
# now the same path but entirely in frequency domain
#

# create a frequency domain convolved image
F = np.fft.fftshift( np.fft.fft2( f ) )
G2 = F * K

# back to spatial, save frequency convolved image  
g2 = np.fft.ifft2( np.fft.ifftshift( G2 ) )
save_image( np.abs(g2), "g_freq.png" )

# inverse filter the frequency convolved image
F_HAT2 = G2 / K
a = np.nan_to_num( F_HAT2 )
f_hat2 = np.fft.ifft2( np.fft.ifftshift( a ) ) 
save_image( np.abs( f_hat2 ), "f_hat_freq.png" )

Моя "f_hat_frequency" my f_hat_frequency

Моя "f_hat_spatial": - ( my f_hat_spatial

Большое спасибо за любую помощь.

[РЕДАКТИРОВАТЬ] Я работаю на Mac OSX 10.6.8 с использованием Numpy 1.6.0 через бесплатную 32-разрядную версию Enthought. ( http://www.enoughtt.com/products/epd_free.php ) Python 2.7.2 | EPD_free 7.1-1 (32-бит)

ИЗМЕНИТЬ 31 октября 2011 г. Я думаю, что то, что я пытаюсь сделать, имеет более глубокие математические корни, чем я понимаю. {{1 }} http://www.owlnet.rice.edu/~elec539/Projects99/BACH/proj2/inverse.html немного помогло. Добавление следующего в мой код перед обратным фильтром:

H_HAT = np.copy(K)
np.putmask( H_HAT, H_HAT>0.0001, 0.0001 )

дает мне изображение, но с большим количеством звонков (вероятно, из-за моего прямоугольного фильтра; необходимо переключиться на гауссовский). Кроме того, смещение изображения с частотной фильтрацией, скорее всего, вызывает проблему. Мой профессор просмотрел мой код, не может найти проблему. Она предлагает продолжать использовать изображение с частотной фильтрацией, а не изображение с пространственной фильтрацией.

У меня есть аналогичный вопрос по dsp.stac kexchange.com: https://dsp.stackexchange.com/questions/538/using-the-inverse-filter-to-correct-a-spatially-convolved-image

6
задан Community 13 April 2017 в 12:47
поделиться