Моему классу обработки изображений присвоен проект по восстановлению изображений. В настоящее время я работаю над обратным фильтром. изображение -> ухудшить -> обратный фильтр -> восстановить изображение. Я использую простой коробочный фильтр 5x5 для моей деградации.
Если я сворачиваю изображение в пространственной области, перехожу в частотную область, затем инверсно фильтрую свернутое изображение с помощью fft ядра, я получаю беспорядок. Если я сверну изображение в частотной области, то при обратной фильтрации этого изображения я получу хорошее изображение.
Свертка в частотной и пространственной областях должна быть одинаковой. Моя единственная мысль - я делаю что-то не так с ядром? Я использую 5х5 коробчатый фильтр. Пространственная свертка делит конечный результат на 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" :-(
Большое спасибо за любую помощь.
[EDIT] Я работаю на Mac OSX 10.6.8 с использованием Numpy 1.6.0 через бесплатную 32-разрядную версию Enthought. (http://www.enthought.com/products/epd_free.php) Python 2.7.2 | EPD_free 7.1-1 (32-разрядная версия)
РЕДАКТИРОВАТЬ 31-Oct-2011.
Я думаю, что то, что я пытаюсь сделать, имеет более глубокие математические корни, чем я понимаю.
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.stackexchange.com: https://dsp.stackexchange.com/questions/538/using-the-inverse-filter-to-correct-a-spatially-convolved-image