Моему классу обработки изображений назначен проект по восстановлению изображений. Сейчас я работаю над обратным фильтром. изображение -> деградировать -> обратный фильтр -> восстановить изображение. Я использую простой коробчатый фильтр 5x5 для моей деградации.
Если я сворачиваю изображение в пространственной области, перехожу в частотную область, а затем инвертирую свернутое изображение с помощью функции fft ядра, я получаю беспорядок. Если я сворачиваю изображение в частотной области, а затем инвертирую это изображение, я получаю хорошее изображение.
Свертка в частотной и пространственной областях должна быть идентична. Моя единственная мысль, что я что-то не так делаю с ядром? Я использую коробчатый фильтр 5x5. Пространственная свертка делит конечный результат на np.sum (поле).Я пробовал нормализовать окно с помощью:
box = np.ones( 25 ).reshape( 5,5 ) / 25.0
, но получил тот же результат с обратным фильтром мусора.
Я также заметил, что свернутое по частоте изображение ("g_freq.png" из приведенного ниже кода) смещено, вероятно, из-за того, что FFT заполняет верхнюю и левую границы нижним и правым краями изображения. Может ли это быть причиной проблемы?
Пространственная свертка:
Свертка частоты: обратите внимание на отступы вверху / слева.
Ниже приведен простейший возможный код для создания проблемы. 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"
Моя "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