내 이미지 처리 클래스에 이미지 복원시 프로젝트가 할당되었습니다. 나는 현재 Inverse Filter를 연구 중이다. 이미지 -> 품질 저하 -> 역 필터 -> 이미지 복원. 나는 성능 저하를 위해 간단한 5x5 박스 필터를 사용하고있다.공간 컨벌루션 이미지와 주파수 컨벌루션 이미지의 역 필터
공간 도메인에서 이미지를 콘볼 루션하면 주파수 도메인으로 이동 한 다음 커널의 fft로 인버트 된 이미지를 역 필터링합니다. 엉망이됩니다. 주파수 영역에서 이미지를 콘볼 루션 (convolve) 한 다음 반전 필터를 사용하면 좋은 이미지를 얻을 수 있습니다.
주파수 도메인과 공간 도메인 컨볼 루션은 동일해야합니다. 내 유일한 생각은 내가 커널에 뭔가 잘못하고 있는거야? 5x5 상자 필터를 사용하고 있습니다. 공간 컨볼 루션은 최종 결과를 np.sum (상자)로 나눕니다. 상자 정상화를 시도했습니다.
box = np.ones(25).reshape(5,5)/25.0
하지만 같은 쓰레기 반전 필터링 결과가 표시됩니다.
나는 또한 이미지의 아래쪽/오른쪽으로 FFT 패딩으로 인해 주파수 convolved 이미지 (아래 코드에서 "g_freq.png")가 이동하는 것을 발견했습니다. 이것이 문제의 원인이 될 수 있습니까?
공간 컨볼 루션 :
주파수 회선 : 상단/왼쪽을 따라 패딩을 확인합니다.
문제를 만드는 가장 간단한 코드는 다음과 같습니다. 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".
[편집] 나는 맥 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 비트)
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
죄송합니다. 당신이 올바른지. 나는 내 직책을 고치고있다. –