파이썬으로 처음부터 이미지 처리 (5) 푸리에 변환

기본이 되는 화상 처리를 처음부터 공부해 나가는 시리즈 (5).

OpenCV-Python 튜토리얼을 참고로,
이미지 인식 책 htps //w w. 아마존. 이. jp/dp/4061529129/
에서 하고 있는 처리의 이해를 진행시키는 방침입니다.

목차



1. 환경
2. 푸리에 변환
3. 하이 패스 필터
4. 저역 통과 필터

환경



파이썬 3.7.0
OpenCV 4.1.0
Jupyter Notebook

푸리에 변환



그레이 스케일의 가이코츠 이미지에 2차원 이산 푸리에 변환(DFT)을 적용.
중심에 흰색 영역이 집중되어 있으며, 저주파 성분을 많이 포함하고 있다.

fourier.py

import cv2
import numpy as np
from matplotlib import pyplot as plt
from pylab import rcParams
%matplotlib inline
rcParams['figure.figsize'] = 25, 20

#grayscaleで読み込み
img = cv2.imread('/brabra/1.jpg',0)

#フーリエ変換
f = np.fft.fft2(img)
#画像中心を原点に変更
fshift = np.fft.fftshift(f)
#フーリエ変換結果は複素数なので絶対値にし、logにしている
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()



하이패스 필터



고역 통과 필터(고주파 성분만 남긴다)를 행하였다. 푸리에 변환 후, 직사각형 윈도우에서 원점 부근의 성분을 필터링하여 화상으로 되돌리고있다.

highpass.py

rows, cols = img.shape
#画像の中心
crow,ccol = int(rows/2) , int(cols/2)
#フィルタする原点付近の幅
reg = 50

#フーリエ変換像からフィルタ
fshift[crow-reg:crow+reg, ccol-reg:ccol+reg] = 0
#逆フーリエ変換で画像に戻す
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
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 HPF'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(img_back)
plt.title('Result in JET'), plt.xticks([]), plt.yticks([])

plt.show()



가이코츠의 가장자리가 남아 있는 것으로 나타났다.

저역 통과 필터



저역 통과 필터(저주파 성분만 남긴다)를 행하였다. 푸리에 변환 후, 원점 부근만 남기도록 처리하고, 화상으로 되돌리고 있다.

lowpass.py

#opencvでフーリエ変換
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
#原点シフト
dft_shift = np.fft.fftshift(dft)
#絶対値,log
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)
#残す原点付近の幅
fil2 = 20

# マスク作成
mask = np.zeros((rows,cols,2),np.uint8)
mask[crow-fil2:crow+fil2, ccol-fil2:ccol+fil2] = 1

# フーリエ変換象にマスク適用
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를 이용한 이미지 처리(OpenCV-Python 튜토리얼)
    http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_table_of_contents_imgproc/py_table_of_contents_imgproc.html#py-table-of-content-imgproc
  • 화상 인식(기계 학습 프로페셔널 시리즈)
    htps //w w. 아마존. 이. jp/dp/4061529129/
  • 좋은 웹페이지 즐겨찾기