傅里叶变换
dft=cv.dft(img_float32,flags=cv.DFT_COMPLEX_OUTPUT):
flags:标志位,指定变换类型,cv.DFT_COMPLEX_OUTPUT会返回复数结果。
傅立叶变换,将输入的图像从空间域转换到频率域。
返回结果: 此函数返回一个复杂数值数组,即傅立叶变换的结果。
对于每个像素位置,结果数组中包含两个值:一个实部和一个虚部,这两个值共同构成了一个复数。如果输入的图像是灰度图像,那么结果就是一个二维复数数组。如果输入的是彩色图像,那么结果就是三个二维复数数组(对应于RGB三个通道)。
dft_shift=np.fft.fftshift(dft):
傅立叶变换的结果进行中心移位。在傅立叶变换中,频率是按照从低到高的顺序排列的而在图像中,我们通常更关注中心部分的频率,因此需要将零频率分量(直流分量)移动到频谱的中央。此外,这个函数也用于将频率域的坐标移动到以中心为原点的参考点。
magnitude_spectrum=20*np.log(cv.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
dft_shift[:,:,0] 和 dft_shift[:,:,1],这是两个来自前面傅立叶变换步骤的结果,分别代表了傅立叶变换后的实部和虚部计算傅立叶变换结果的幅度谱。20*np.log() 对这个幅度进行对数转换并乘以20,得到的结果就是振幅谱。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img =cv.imread("../Lena.png",0)
img_float32=np.float32(img)
dft=cv.dft(img_float32,flags=cv.DFT_COMPLEX_OUTPUT)
dft_shift=np.fft.fftshift(dft)
magnitude_spectrum=20*np.log(cv.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()
低通滤波和高斯滤波
滤波:
低通滤波器:保留低频,使图片模糊
高通滤波器:保留高频,是图片细节增强
低通滤波:
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img=cv.imread("../Lena.png",0)
img_float=np.float32(img)
dft=cv.dft(img_float,flags=cv.DFT_COMPLEX_OUTPUT)
dft_shift=np.fft.fftshift(dft)
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.ifftshift(fshift)
img_back=cv.idft(f_ishift)
img_back=cv.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("Result")
plt.xticks([]),plt.yticks([])
plt.show()
高通滤波
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img=cv.imread("../Lena.png",0)
img_float=np.float32(img)
dft=cv.dft(img_float,flags=cv.DFT_COMPLEX_OUTPUT)
dft_shift=np.fft.fftshift(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
#IDFT
fshift=dft_shift*mask
f_ishift=np.fft.ifftshift(fshift)
img_back=cv.idft(f_ishift)
img_back=cv.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("Result")
plt.xticks([]),plt.yticks([])
plt.show()