2016-10-03 2 views
2

opencv에서 이것을 설명하는 몇 가지 문서를 보았습니다. 그러나 제 목표는 numpy로 & scipy로 수행하는 것입니다.역 푸리에 변환을 위해 이미지에서 고주파 내용을 제거하는 방법

저주파 필터링을 위해 60x60 직사각형으로 스펙트럼의 중심을 마스킹했기 때문에 스펙트럼의 바깥 쪽 영역을 일종의 원으로 마스크해야한다고 생각합니다. 그러나 나는 어떻게 이해할 수 없었다.

numpy 배열을 사용하여 역 푸리에 변환을 수행하기 전에 크기 스펙트럼에서 고주파 성분을 제거하는 방법을 배우고 싶습니다.

필자는 푸리에 변환 및 역 푸리에 변환 (저주파 성분 제거 용)에 대한 코드를 제공했습니다. 내 목표는 비슷한 일을하는 것이지만, 이번에는 저주파수를 제거한 후 역 FT에서했던 것처럼 재구성 된 이미지의 변화를 관찰 할 수 있도록 고주파 성분을 제거하고 싶습니다.

import numpy as np 
import scipy 
import scipy.misc 
import matplotlib.pyplot as plt 
from scipy import ndimage 
from PIL import Image 

img = Image.open('gorkem.png').convert('L') 
img.save('output_file.jpg') 

f = np.fft.fft2(img) 
fshift = np.fft.fftshift(f) ## shift for centering 0.0 (x,y) 
magnitude_spectrum = 20*np.log(np.abs(fshift)) 

plt.subplot(121),plt.imshow(img, cmap = 'gray') 
plt.title('Input Image'), plt.xticks([]), plt.yticks([]) 
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray') 
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([]) 
plt.show() 

## removing low frequency contents by applying a 60x60 rectangle window (for masking) 
rows = np.size(img, 0) #taking the size of the image 
cols = np.size(img, 1) 
crow, ccol = rows/2, cols/2 

fshift[crow-30:crow+30, ccol-30:ccol+30] = 0 
f_ishift= np.fft.ifftshift(fshift) 

img_back = np.fft.ifft2(f_ishift) ## shift for centering 0.0 (x,y) 
img_back = np.abs(img_back) 

plt.subplot(131),plt.imshow(img, cmap = 'gray') 
plt.title('Input Image'), plt.xticks([]), plt.yticks([]) 
plt.subplot(132),plt.imshow(img_back, cmap = 'gray') 
plt.title('Image after removing low freq'), plt.xticks([]), plt.yticks([]) 

inverse Fourier transformed image

답변

2

당신은 당신의 원본 이미지에서 제거 낮은 주파수와 이미지 빼지 수 있습니다

original = np.copy(fshift) 
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0 
f_ishift= np.fft.ifftshift(original - fshift) 

enter image description here

관련 문제