OpenCV-Python 은 cv2 를 사용 하여 푸 리 엽 변환 을 실현 합 니 다.

머리말
앞의 박문 에서 우 리 는 푸 리 엽 변환 의 원리 와 Numpy 라 이브 러 리 를 사용 하여 푸 리 엽 변환 을 실현 하 는 것 을 상세 하 게 설명 했다.그러나 사실 OpenCV 는 푸 리 엽 변환 을 직접 실현 하 는 함수 가 있다.
OpenCV 에서 우 리 는 cv2.dft()를 통 해 푸 리 엽 변환 을 실현 하고 cv2.idft()를 사용 하여 역 푸 리 엽 변환 을 실현 합 니 다.두 함수 의 정 의 는 다음 과 같다.

cv2.dft(    ,    )
이 원본 그림 은 np.float 32 형식 이 어야 합 니 다.그래서 우 리 는 먼저 cv2.float 32()함 수 를 사용 하여 그림 을 변환 해 야 합 니 다.표 지 를 바 꾸 는 값 은 보통 cv2.DFT 이다.COMPLEX_OUTPUT,복수 배열 을 출력 하 는 데 사용 합 니 다.
cv2.dft()함수 의 변환 을 거 친 후에 우 리 는 원본 이미지 의 스펙트럼 정 보 를 얻 을 수 있 습 니 다.이때 영 분량 은 Numpy 라 이브 러 리 구현 과 마찬가지 로 중심 에 있 지 않 습 니 다.여기 서 우 리 는 numpy.fft.fftshift()함 수 를 사용 하여 중간 위치 로 이동 해 야 합 니 다.
특히 주의해 야 할 것 은 함수 cv2.dft()반환 값 은 2 채널 이 고 1 번 채널 은 결과 의 실수 부분 이 며 2 번 채널 은 결과 의 허수 부분 입 니 다.numpy.fft.fftshift()함 수 를 사용 하여 처리 한 후 스펙트럼 이미 지 는 실제 와 가상 으로 구 성 된 값 일 뿐 표시 하려 면 다른 함수 cv2.magnitude()에 사용 해 야 합 니 다.
이 함수 의 정 의 는 다음 과 같다.

cv2.magnitude(  1,  2)
매개 변수 1:부동 소수점 x 좌표 값,즉 실제 부분
매개 변수 2:부동 소수점 y 좌표 값,즉 허 부 입 니 다.매개 변수 1 과 같은 크기(size)를 가 져 야 합 니 다.
스펙트럼 이미지 의 폭 을 얻 은 후에 그 레이스 케 일 공간[0,255]에 폭 을 투사 하여 그 레이스 케 일 이미지 로 표시 해 야 한다.전편 블 로그 와 마찬가지 로 20*np.log(cv2.magnitude()를 사용 합 니 다.
푸 리 엽 변환 실현
다음은 상기 OpenCV 함 수 를 통 해 푸 리 엽 변환 을 실현 하고 스펙트럼 정 보 를 표시 합 니 다.

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

img = cv2.imread("4.jpg", 0)

dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
result = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))


plt.subplot(121)
plt.imshow(img, cmap="gray")
plt.axis('off')
plt.subplot(122)
plt.imshow(result, cmap="gray")
plt.axis('off')
plt.show()
실행 후,표시 효 과 는 전편 박문 과 같 습 니 다.
效果
역 푸 리 엽 변환 실현
아니면 위의 블 로그 와 마찬가지 로 여기 서 우 리 는 이미지 의 스펙트럼 정 보 를 걸 러 내 고 여기 서 우 리 는 저주파 정 보 를 걸 러 냅 니 다.

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

img = cv2.imread("4.jpg", 0)

dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
result = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))

rows,cols=img.shape
rows_half,cols_half=int(rows/2),int(cols/2)
mask=np.zeros((rows,cols,2),dtype=np.uint8)
mask[rows_half-30:rows_half+30,cols_half-30:cols_half+30]=1


#      
fShift=dftShift*mask
ishift=np.fft.ifftshift(fShift)
iimg=cv2.idft(ishift)
iimg=cv2.magnitude(iimg[:,:,0],iimg[:,:,1])


plt.subplot(121)
plt.imshow(img, cmap="gray")
plt.axis('off')
plt.subplot(122)
plt.imshow(iimg, cmap="gray")
plt.axis('off')
plt.show()
실행 후 효 과 는 다음 과 같 습 니 다.
低频过滤
저주파 정 보 를 걸 러 낸 후 이미지 의 가장자리 정보 가 약 해 졌 다.
OpenCV-Python 이 cv2 를 사용 하여 푸 리 엽 변환 을 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 OpenCV 푸 리 엽 변환 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기