2011-10-28 34 views
6

画像処理クラスに画像復元に関するプロジェクトが割り当てられています。私は現在、インバースフィルターに取り組んでいます。イメージ - >劣化 - >逆フィルター - >イメージを復元します。私は劣化のために単純な5x5ボックスフィルタを使用しています。空間畳み込み対周波数畳み込み画像の逆フィルタ

イメージを空間領域で畳み込み、周波数領域に移動し、カーネルのfftで反転したイメージを反転フィルタリングすると、混乱します。私が周波数領域でイメージを畳み込むと、そのイメージをInverse Filterでフィルタリングすると、良いイメージが得られます。

周波数ドメインと空間ドメインの畳み込みは同じでなければなりません。私の唯一の考えは、私がカーネルに何か問題があるということですか?私は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

マイ任意の助け my f_hat_spatial

多くのおかげ:-("f_hat_spatial"。

[EDIT]私は、Mac OSX上で実行していますよ10.6.8 Enthoughtの無料32ビット版でNumpy 1.6.0を使用する(http://www.enthought.com/products/epd_free.php)Python 2.7.2 | EPD_free 7.1-1(32-bit)

EDIT 2011年10月31日。 私がしようとしていることは、私が理解するよりも深い数学的なルーツを持っていると思います。 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) 

は私に画像を与えるが、(おそらく私のボックスフィルタの、ガウスに切り替える必要)リンギングがたくさん。また、周波数フィルタリングされた画像のオフセットは、問題を引き起こす可能性が非常に高い。私の教授は私のコードを見て、問題を見つけることができません。彼女の提案は、空間的にフィルタリングされた画像ではなく周波数フィルタリングされた画像を使用し続けることです。 https://dsp.stackexchange.com/questions/538/using-the-inverse-filter-to-correct-a-spatially-convolved-image

+0

私はコードを実行しました.f_hat_spatialとf_hat_frequencyに対して上記で与えられたラベルがスワップされているように見えます(実際には再構成に失敗した "f_hat_spatial"イメージです)。 – nobar

+0

あなたは正しいです。私は私のポストを修正しています。 –

答えて

2

問題がFF_HAT2が同一でないことを明確に示します。

は私がdsp.stackexchange.com上で同様の質問があります。 nan_to_numに電話する必要があるという事実は、乗算と除算の間に何かが間違っていることを明確に示しています( K)。考えられる原因は整数オーバーフローです。ロード後に fを浮動小数点型に変換してみてください。

+0

フロートのレナは助けになりません。 :-(このページhttp://www.owlnet.rice.edu/~elec539/Projects99/BACH/proj2/inverse.htmlはかなり助けになりました。私は悪いイメージを取り戻すことができます。しかし、少なくとも私は始めています私の問題の深さを理解する。 –

関連する問題