OpenCV 이미지 변환 의 푸 리 엽 변환 응용

머리말
이 블 로 그 는 Numpy,OpenCV 로 그림 을 계산 하 는 푸 리 엽 변환 과 푸 리 엽 변환 을 포함 한 OpenCV 의 이미지 변환 을 소개 할 것 이다.
2D Discrete 푸 리 에 변환(DFT)2 차원 분산 푸 리 에 변환
고속 푸 리 에 변환(FFT)고속 푸 리 에 변환
푸 립 엽 변환 은 각종 필터 의 주파수 특성 을 분석 하 는 데 쓰 인 다.이미지 에 대해 서 는 2 차원 분산 푸 립 엽 변환(DFT)을 사용 하여 주파수 영역 을 구한다.고속 푸 립 엽 변환(FFT)이 라 고 불 리 는 빠 른 알고리즘 은 DFT 의 계산 에 사용 된다.
OpenCV 는 cv2.dft(),cv2.idft()를 사용 하여 푸 리 엽 변환 을 실현 하고 효율 이 더 높다(OpenCV 보다 3 배 빠르다).
Numpy 는 np.ifft 2(),np.fft.ifftshift()를 사용 하여 푸 리 엽 변환 을 실현 하고 더욱 우호 적 으로 사용 합 니 다.
1.효과 도
그 레이스 케 일 VS 푸 리 에 변환 효과 도 는 다음 과 같다.
흰색 구역 은 대부분 중심 에 있 고 낮은 주파 수 를 나타 내 는 내용 이 많다 는 것 을 알 수 있다.

푸 리 엽 변환 저주파 내용 제거 후 효과 도 는 다음 과 같다.
직사각형 필 터 를 사용 한 후 효과 가 좋 지 않 고 파문 이 있 는 벨 효과 가 있 음 을 볼 수 있다.가우스 필터 로 좋 음;

푸 리 엽 변환 고주파 내용 제거 후 효과 도 는 다음 과 같다.
그림 의 고주파 내용 을 삭제 합 니 다.LPF 를 그림 에 적용 할 것 입 니 다.그림 이 실제로 흐릿 해 집 니 다.

각 필터 가 HPF(High Pass Filter)인지 LPF(Low Pass Filter)인지 한눈 에 알 수 있 습 니 다.
라 프 라 스 는 고주파 필터;

2.원리
DFT 의 성능 최적화:일정한 배열 사이즈 에서 DFT 가 계산 하 는 성능 이 비교적 좋다.배열 크기 가 2 의 멱 일 때 속도 가 가장 빠르다.크기 가 2,3,5 인 곱 하기 배열 도 효과적으로 처리 할 수 있다.
최상의 성능 을 위해 OpenCV 에서 제공 하 는 함수 cv2.getOptimalDFTSize()를 통 해 최상의 사 이 즈 를 찾 을 수 있 습 니 다.
그리고 그림 을 최고의 성능 크기 의 배열 로 채 우 고 OpenCV 에 대해 서 는 0 을 수 동 으로 채 워 야 합 니 다.다만 Numpy 에 대해 서 는 FFT 가 계산 한 새 크기 를 지정 할 수 있어 자동 으로 0 을 채 웁 니 다.
최 적 화 된 배열 을 사용 하면 기본적으로 4 배의 효율 을 높 일 수 있다.반면 OpenCV 자 체 는 Numpy 보다 효율 이 3 배 가까이 빠르다.
라 프 라 스 는 하 이 패스 필터(High Pass Filter)
3.소스 코드
3.1 Numpy 푸 리 엽 변환 실현

#      

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

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

#   Numpy       :fft 
# fft.fft2()       
#   1:        
#   2:>      0  ;  <           ;           
f = np.fft.fft2(img)

#       ,     (    )       。
#          ,     np.fft.fftshift()           。
#          ,       。
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
rows, cols = img.shape
crow, ccol = rows // 2, 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)

#          :             。                     。
#                JET       ,     (            ,          。)
#          mask   ,  mask    sinc  ,       。           ,        mask。)
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()
3.2 OpenCV 푸 리 에 변환 실현

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

img = cv2.imread('ym3.jpg', 0)
rows, cols = img.shape
print(rows, cols)

#   DFT       
nrows = cv2.getOptimalDFTSize(rows)
ncols = cv2.getOptimalDFTSize(cols)
print(nrows, ncols)

nimg = np.zeros((nrows, ncols))
nimg[:rows, :cols] = img
img = nimg

# OpenCV         ,          np.float32,      cv2.dft() cv2.idft()。
#      Numpy  ,      。            ,            。
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()

rows, cols = img.shape
crow, ccol = rows // 2, cols // 2

#       mask,      1,    0
#             ,    LPF     。         。
#                    ,   LF  , HF   0。
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 1

#     Mask   DTF
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.3 HPF or LPF?

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

#        
mean_filter = np.ones((3, 3))

#       
x = cv2.getGaussianKernel(5, 10)
gaussian = x * x.T

#          Scharr-x  
scharr = np.array([[-3, 0, 3],
                   [-10, 0, 10],
                   [-3, 0, 3]])
# Sobel_x
sobel_x = np.array([[-1, 0, 1],
                    [-2, 0, 2],
                    [-1, 0, 1]])
# Sobel_y
sobel_y = np.array([[-1, -2, -1],
                    [0, 0, 0],
                    [1, 2, 1]])
#     
laplacian = np.array([[0, 1, 0],
                      [1, -4, 1],
                      [0, 1, 0]])

filters = [mean_filter, gaussian, laplacian, sobel_x, sobel_y, scharr]
filter_name = ['mean_filter', 'gaussian', 'laplacian', 'sobel_x', \
               'sobel_y', 'scharr_x']
fft_filters = [np.fft.fft2(x) for x in filters]
fft_shift = [np.fft.fftshift(y) for y in fft_filters]
mag_spectrum = [np.log(np.abs(z) + 1) for z in fft_shift]

for i in range(6):
    plt.subplot(2, 3, i + 1), plt.imshow(mag_spectrum[i], cmap='gray')
    plt.title(filter_name[i]), plt.xticks([]), plt.yticks([])

plt.show()

레 퍼 런 스
  • https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_transforms/py_fourier_transform/py_fourier_transform.html#fourier-transform
  • 총결산
    여기 서 OpenCV 이미지 변환 의 푸 리 엽 변환 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 OpenCV 이미지 변환 푸 리 엽 변환 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기