Обратный фильтр пространственно-свернутого и частотно-свернутого изображения - PullRequest
6 голосов
/ 28 октября 2011

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

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

Свертка в частотной и пространственной областях должна быть одинаковой. Моя единственная мысль - я делаю что-то не так с ядром? Я использую 5х5 коробчатый фильтр. Пространственная свертка делит конечный результат на 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

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

[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

1 Ответ

2 голосов
/ 31 октября 2011

Проблема явно в том, что F и F_HAT2 не идентичны.Тот факт, что вам нужно вызвать nan_to_num, является четким признаком того, что что-то не так между умножением и делением на K.Возможная причина - целочисленное переполнение.Попробуйте преобразовать f в тип с плавающей точкой после загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...