2011-10-28 3 views
6

내 이미지 처리 클래스에 이미지 복원시 프로젝트가 할당되었습니다. 나는 현재 Inverse Filter를 연구 중이다. 이미지 -> 품질 저하 -> 역 필터 -> 이미지 복원. 나는 성능 저하를 위해 간단한 5x5 박스 필터를 사용하고있다.공간 컨벌루션 이미지와 주파수 컨벌루션 이미지의 역 필터

공간 도메인에서 이미지를 콘볼 루션하면 주파수 도메인으로 이동 한 다음 커널의 fft로 인버트 된 이미지를 역 필터링합니다. 엉망이됩니다. 주파수 영역에서 이미지를 콘볼 루션 (convolve) 한 다음 반전 필터를 사용하면 좋은 이미지를 얻을 수 있습니다.

주파수 도메인과 공간 도메인 컨볼 루션은 동일해야합니다. 내 유일한 생각은 내가 커널에 뭔가 잘못하고 있는거야? 5x5 상자 필터를 사용하고 있습니다. 공간 컨볼 루션은 최종 결과를 np.sum (상자)로 나눕니다. 상자 정상화를 시도했습니다.

box = np.ones(25).reshape(5,5)/25.0 

하지만 같은 쓰레기 반전 필터링 결과가 표시됩니다.

나는 또한 이미지의 아래쪽/오른쪽으로 FFT 패딩으로 인해 주파수 convolved 이미지 (아래 코드에서 "g_freq.png")가 이동하는 것을 발견했습니다. 이것이 문제의 원인이 될 수 있습니까?

공간 컨볼 루션 : 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".

[편집] 나는 맥 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

+0

코드를 실행했는데 위의 f_hat_spatial 및 f_hat_frequency에 대한 레이블이 바뀌 었습니다 (사실 재구성에 실패한 "f_hat_spatial"이미지 임). – nobar

+0

죄송합니다. 당신이 올바른지. 나는 내 직책을 고치고있다. –

답변

2

문제는 FF_HAT2이 동일하지 않은 것을 분명히 :

나는 dsp.stackexchange.com에 비슷한 질문이 있습니다. nan_to_num에 전화해야한다는 사실은 곱셈과 나눗셈 사이에 무언가가 잘못되어 있다는 것을 나타내는 명확한 표시입니다. K. 가능한 원인은 정수 오버 플로우입니다. 로드 후 f을 부동 소수점 유형으로 변환 해보십시오.

+0

Lena의 Lena가 도움이되지 않습니다. :-(이 페이지 http://www.owlnet.rice.edu/~elec539/Projects99/BACH/proj2/inverse.html은 약간의 도움을주었습니다. 불량한 이미지를 얻을 수는 있습니다.하지만 적어도 나는 시작하고 있습니다. 내 문제의 깊이를 이해하기. –

관련 문제