opencv python 푸 리 엽 변환 사용

이론.
푸 립 엽 변환 은 각종 필터 의 주파수 특성 을 분석 하 는 데 사 용 됩 니 다.이미지 에 대해 2D 이산 푸 리 엽 변환(DFT)은 주파수 영역 을 찾 는 데 사 용 됩 니 다.빠 른 푸 리 엽 변환(FFT)의 빠 른 알고리즘 은 DFT 를 계산 하 는 데 사 용 됩 니 다.
하나의 사인,x(t)=Asin(2 pi ft)에서 우 리 는 f 는 신호 의 주파수 라 고 할 수 있다.만약 에 그의 주파수 영역 이 받 아들 여지 면 우 리 는 f 의 피크 수 치 를 볼 수 있다.만약 에 신호 가 샘플링 되 어 이산 신 호 를 형성 하면 우 리 는 같은 주파수 영역 을 얻 을 수 있 지만[-pi,pi]or[0,2 pi]범위 내 에서 주기 적 인(or[0,N]for N-point DFT)이다.
그림 을 두 방향 에서 샘플링 하 는 신호 로 볼 수 있 습 니 다.따라서 X 와 Y 방향 에서 푸 리 엽 변환 을 하면 그림 의 주파수 표 시 를 얻 을 수 있 습 니 다.
더욱 직관 적 인 것 은 사인 신호 에 대해 진폭 이 짧 은 시간 안에 매우 빨리 변화 한다 면 고주파 신호 라 고 할 수 있다.만약 에 변화 가 느 리 면 저주파 신호 이 고 똑 같은 생각 을 그림 으로 확대 할 수 있다.변 과 소음 은 이미지 의 고주파 내용 이 고 진폭 이 큰 변화 가 없다 면 그것 은 저주파 분량 이다.
Numpy 의 푸 리 엽 변환np.fft.fft2() 첫 번 째 매개 변 수 는 그림 을 입력 하 는 것 입 니 다.그 레이스 케 일 그림 입 니 다.
두 번 째 매개 변 수 는 선택 할 수 있 습 니 다.출력 배열 의 크기 를 결정 합 니 다.입력 이미지 의 크기 보다 크 면 입력 그림 은 FFT 를 계산 하기 전에 0 을 채 웁 니 다.입력 이미지 보다 작 으 면 입력 그림 이 재단 되 고 매개 변수 가 전달 되 지 않 으 면 출력 배열 의 크기 는 입력 과 같 습 니 다.
일단 결과 가 나 오 면 0 주파수 분량(DC 분량)은 왼쪽 상단 에 있 게 된다.이 를 중심 위치 에 두 려 면 두 방향 에서 결 과 를 N2 로 이동 해 야 한다.np.fft.fftshift()주파수 변환 을 찾 으 면 크기 스펙트럼 을 찾 을 수 있다.
코드:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('img.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()

중심 에서 더 많은 흰색 구역 을 볼 수 있 고 저주파 의 내용 이 더 많다 는 것 을 나타 낸다.
현재 주파수 영역 에서 연산 을 할 수 있 습 니 다.예 를 들 어 고역 필터 와 재 구축 이미지,즉 역 DFT 를 찾 을 수 있 습 니 다.사각형 창 크기 의 60x 60 으로 저주파 부분 을 제거 하고np.fft.ifftshift()역방향 이동 을 사용 하여 DC 구성 요 소 를 다시 왼쪽 상단 에 나타 나 게 한 다음np.ifft2()함수 로 반 FFT 를 찾 으 면 결 과 는 복수 이 고 절대 값 을 얻 을 수 있 습 니 다.
코드:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('img.jpg',0)

f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20*np.log(np.abs(fshift))

rows, cols = img.shape
crow,ccol = int(rows/2) , int(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)
img_back = np.abs(img_back)


plt.subplot(221),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(223),plt.imshow(img_back)
plt.title('Result in JET'), plt.xticks([]), plt.yticks([])
plt.subplot(224),plt.imshow(img_back, cmap = 'gray')
plt.title('Image after HPF'), plt.xticks([]), plt.yticks([])
plt.show()

그 결과 고역 필 터 는 가장자리 검출 작업 이 었 다.
OpenCV 의 푸 리 에 변환
OpenCV 는cv.dft()cv.idft()함 수 를 제공 합 니 다.앞의 것 과 같은 결 과 를 되 돌려 주지 만 두 개의 채널 이 있 습 니 다.첫 번 째 채널 은 결과 의 실제 부분 이 있 고 두 번 째 채널 은 하나의 가상 부분 이 있 을 것 입 니 다.
그림 을 입력 하려 면 먼저 np.float 32 로 변환 해 야 합 니 다.

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('img.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]))

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()

한 번 촬영 에서 크기 와 위상 을 동시에 되 돌 릴 수 있 는cv.cartToPolar()도 사용 할 수 있다.
지금 우리 가 해 야 할 일 은 역 DFT 입 니 다.이번 에는 그림 의 고주파 내용 을 제거 합 니 다.즉,LPF 를 그림 에 적용 합 니 다.실제로 그림 을 흐 리 게 합 니 다.이 를 위해 서,우 리 는 저주파 내용 을 통 해 높 은 값(1)저주파 마스크 를 만 듭 니 다.즉,고주파 구역 에 서 는 0 입 니 다.

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('img.jpg',0)

dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)

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()

NOTE:
OpenCV 함수cv.dft()cv.idft()는 Numpy 함수 보다 빠 릅 니 다.그러나 Numpy 기능 은 더욱 사용자 친화 적 입 니 다.
Fourier Transform
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기