파이썬으로 처음부터 이미지 처리 (5) 푸리에 변환
16623 단어 파이썬JupyterOpenCVmatplotlib
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()
이번에는 가장자리가 얇아졌다. 엣지 부근에서 파와 같이 보이는 것은 링잉 효과라고 하는 구형 윈도우로 필터했을 때에 나오는 것과의 일.
요약
이미지에 대한 푸리에 변환과 고역 통과 필터, 저역 통과 필터에 대해 수행하고 이해를 깊게했다.
참고문헌
파이썬 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()
이번에는 가장자리가 얇아졌다. 엣지 부근에서 파와 같이 보이는 것은 링잉 효과라고 하는 구형 윈도우로 필터했을 때에 나오는 것과의 일.
요약
이미지에 대한 푸리에 변환과 고역 통과 필터, 저역 통과 필터에 대해 수행하고 이해를 깊게했다.
참고문헌
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でフーリエ変換
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()
이미지에 대한 푸리에 변환과 고역 통과 필터, 저역 통과 필터에 대해 수행하고 이해를 깊게했다.
참고문헌
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/
Reference
이 문제에 관하여(파이썬으로 처음부터 이미지 처리 (5) 푸리에 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/fugunoko/items/41c33ca163c7bb52d283텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)