openCV简要-06 傅里叶变换

1.基本思想
任何连续周期信号可以由一组适当的正弦曲线组合而成。即使是有棱角的信号,也可以用正弦曲线组合无限的逼近它。
图像中的低频部分:变化不明显的部分;图像的高频部分:变化明显的部分(如边界)
2.低通滤波器
将图像中的低频成分保留,而高频成分滤掉。这样会使最终图像所有边界、线条变得模糊。

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

img=cv2.imread('test.jpg',0)
img_float32=np.float32(img)#必须事先转换为np.float32格式
#1.将图像由时域映射为频域,并保留低频
dft=cv2.dft(img_float32,flags=cv2.DFT_COMPLEX_OUTPUT)
#2.结果中低频部分会在左上角,通常要将它放在中心位置
dft_shift=np.fft.fftshift(dft)
#3.矩阵此时为双通道的(复数形式,有实部和虚部)需要将其转换为可表示的灰度图
magnitude_spectrum=20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1])
#这是一个公式,其中cv2.magnitude(x,y)=sqrt(x^2+y^2)
#4.显示结果
plt.subplot(121),plt.imshow(img,cmap='gray')#cmap用于指定图像绘制风格,gray为黑白风格
plt.title('input image'),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum,cmap='gray')
plt.title('output image'),plt.xticks([]),plt.yticks([])


#低通滤波器
#用掩膜选取中心部分的图像,这样就把低频部分保留下来,高频部分去除掉
rows,cols=img.shape
crow,ccol=int(rows/2),int(cols/2)

#掩膜
mask=np.zeros((rows,cols,2),np.uint8)
mask[crow-30:crow+30,ccol-30:ccol+30]=1

#idft
fshift=dft_shift*mask
f_ishift=np.fft.iffshift(fshift)
#把低频部分还原到左上角
img_back=cv2.idft(f_ishift)
img_back=cv2.magnitude(img_back[:,:,0],img_back[:,:,1])

3.高通滤波器
会使图像的边界部分更加明显,剩下的部分相对黯淡。

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

img=cv2.imread('test.jpg',0)
#与低通滤波器的区别在于掩膜部分是保留高频而去掉低频
img_float32=np.float32(img)
dft=cv2.dft(img_float32,cv2.DFT_COMPLEX_OUTPUT)
dft_shift=np.fft.ffshift(dft)

rows,cols=img.shape
crow,ccol=int(rows/2),int(cols/2)

mask=np.ones((rows,cols,2),np.uint8)
mask[crow-30:crow+30][ccol-30:ccol+30]=0

fshift=dft_shift*mask
f_ishift=np.fft.iffshift(fshift)
img_back=cv2.idft(f_ishift)
img_back=cv2.magnitude(img_back[:,:,0],img_back[:,:,1])

おすすめ

転載: blog.csdn.net/qq_43579980/article/details/113242037