画像処理クラスに画像復元に関するプロジェクトが割り当てられています。私は現在、インバースフィルターに取り組んでいます。イメージ - >劣化 - >逆フィルター - >イメージを復元します。私は劣化のために単純な5x5ボックスフィルタを使用しています。空間畳み込み対周波数畳み込み画像の逆フィルタ
イメージを空間領域で畳み込み、周波数領域に移動し、カーネルのfftで反転したイメージを反転フィルタリングすると、混乱します。私が周波数領域でイメージを畳み込むと、そのイメージをInverse Filterでフィルタリングすると、良いイメージが得られます。
周波数ドメインと空間ドメインの畳み込みは同じでなければなりません。私の唯一の考えは、私がカーネルに何か問題があるということですか?私は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"。
[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
私はコードを実行しました.f_hat_spatialとf_hat_frequencyに対して上記で与えられたラベルがスワップされているように見えます(実際には再構成に失敗した "f_hat_spatial"イメージです)。 – nobar
あなたは正しいです。私は私のポストを修正しています。 –