푸링에 변환은 여러가지 필터의 주파수 특성을 분석하는데 필요합니다.
영상의 경우 2D 이산 푸리에 필터 (DFT)를 주파수 영역에서 분석하기 위해서 사용하는데요.
고속화된 알고리즘을 Fast Fourier Transform FFT라고 부르기도 합니다.
푸리에 변환에 대한 자세한 내용은 생략하고 우선 넘파이에서 사용해봅시다.
1. 넘파이에서 푸리에 변환
- 넘파이의 FFT 패키지에서 np.fft.fft2()함수로 주파수 영역으로 변환을 할수 잇습니다.
- 첫번째 매개변수는 흑백 이미지, (옵션) 둘쨰 매개변수는 출력 사이즈가 됩니다.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('C:/Users/do/Documents/github/opencv_python/res/home.jpg',0)
f = np.fft.fft2(img)
magnitude_spectrum = 20*np.log(np.abs(f))
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()
- 아래의 이미지를 보시면 0 주파수 요소(DC 요소)는 왼쪽 위 코너에 있는걸 볼수 있는데요. 이들을 np.fft.fftshift()함수로 중앙으로 이동시킬수 있습니다.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('C:/Users/do/Documents/github/opencv_python/res/home.jpg',0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
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()
- 이제 저주파수 영역대가 중앙으로 모였습니다. 주파수 영역에서는 다양한 연산을 수행할수 있는데, 고주파 필터를 통과시킨후 역 이산 푸리에 변환으로 이미지를 복원시킬수가 있겠습니다.
- 여기서 저주파 영역은 60 x 60 크기의 윈도우로 제거하고, np.fft.ifftshift()로 다시 DC요소를 왼쪽 위 원래 자리로 돌려줍시다. 그러고나서 역 FFT함수로 되돌려주면 되겠습니다.
- 위 이미지는 고주파 통과 필터로 에지 검출 연산을 한 결과를 보여주고 있는데요. 이영상이 이미지 그라디언트에서 본것과 동일한거라고 할수 있겠습니다.
2. opencv 푸리에 변환 - 저주파 통과 필터
- 이전 장에서는 고주파 통과 필터를 사용해서 저주파 요소들을 제거하였다면, 이번에는 opencv로 저주파 통과 필터를 사용하여 고주파 요소를 남겨보겠습니다. 이를 통해 이미지를 블러링 한 결과를 얻을수가 있겠습니다.
- 아까는 저주파 영역에다가 0을 주었지만 이번에는 저주파 영역을 1로 지정해서 저주파 영역들은 통과시키고 고주파 영역은 0이 되도록 하겠습니다.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('C:/Users/do/Documents/github/opencv_python/res/home.jpg',0)
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
rows, cols = img.shape
crow,ccol = int(rows/2) , int(cols/2)
# create a mask first, center square is 1, remaining all zeros
mask = np.zeros((rows,cols,2),np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
# apply mask and inverse DFT
fshift = dft_shift*mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img_back, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
'로봇 > 영상' 카테고리의 다른 글
opencv-python 튜토리얼 - 18. 허프 변환 (0) | 2020.08.15 |
---|---|
opencv-python 튜토리얼 - 17. 탬플릿 매칭 (0) | 2020.08.15 |
opencv-python 튜토리얼 - 15. 히스토그램 (0) | 2020.08.15 |
opencv-python 튜토리얼 - 14. 이미지 피라미드 (0) | 2020.08.15 |
opencv-python 튜토리얼 - 13. 캐니 에지 검출기 (0) | 2020.08.14 |