4.2 频域滤波
修改傅里叶变换以达到特殊目的,然后计算IDFT返回到图像域。
特殊目的:图像增强、图像去噪、边缘检测、特征提取、压缩、加密等。
- 衰减高频而通过低频,低通滤波器,将模糊一幅图像。
- 衰减低频而通过高频,高通滤波器,将增强尖锐的细节,但是会导致图像
的对比度降低。
4.3 高通滤波代码实现
#%%傅里叶逆变换 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r'C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\boat.bmp',cv2.IMREAD_GRAYSCALE) r,c = img.shape r,c = int(r/2),int(c/2) #进行傅里叶变换 f = np.fft.fft2(img) ishift = np.fft.ifftshift(f) ishift[r-30:r+30,c-30:c+30] = 0 #逆变换 iimg = np.fft.ifft2(ishift) #设置区间 iimg = np.abs(iimg) fig,ax = plt.subplots(1,2,figsize=(7,3)) ax1 = plt.subplot(121) ax1.imshow(img,cmap="gray") ax1.axis("off") ax2 = plt.subplot(122) ax2.axis("off") ax2.imshow(iimg,cmap="gray") plt.show()
结果:
4.4 低通滤波代码实现
#%%在频域中低通滤波代码实现 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r'C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\boat.bmp',cv2.IMREAD_GRAYSCALE) #构建掩模 mask = np.zeros_like(img,dtype=np.uint8) r,c = mask.shape r,c = int(r/2),int(c/2) mask[r-30:r+30,c-30:c+3] = 1 #进行傅里叶变换 f = np.fft.fft2(img) ishift = np.fft.ifftshift(f) ishift = ishift*mask #逆变换 iimg = np.fft.ifft2(ishift) #设置区间 iimg = np.abs(iimg) fig,ax = plt.subplots(1,2,figsize=(7,3)) ax1 = plt.subplot(121) ax1.imshow(img,cmap="gray") ax1.axis("off") ax2 = plt.subplot(122) ax2.axis("off") ax2.imshow(iimg,cmap="gray") plt.show()
结果:
5. OpenCV实现傅里叶变换
5.1 OpenCV实现傅里叶变换函数
函数:返回结果=cv2.dft(原始图像,转换标识)
返回结果:是双通道的,第一个的结果是虚数部分,第二个通道的结果是实数部分。原始图像:输入的图像首相应该转换为np.float32格式,np.float(img)转换标识:flags = cv2.DFT_COMPLEX_OUTPUT,输出一个复数阵列函数:numpy.fft.fftshift将零频率分量移到频谱中心。如下图所示:
函数:返回值=cv2.magnitude(参数1,参数2)
计算幅值。参数1:浮点型X坐标值,也就是实部;参数2:浮点型Y坐标值,也就是虚部。
dst(I)=x(I)2+y(I)2
5.2 代码实现
#%%OpenCV实现傅里叶变换函数 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r'C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\lena.bmp',cv2.IMREAD_GRAYSCALE) #进行傅里叶变换 dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT) dftshift = np.fft.fftshift(dft) result = 20*np.log(np.abs(cv2.magnitude(dftshift[:,:,0],dftshift[:,:,1]))) fig,ax = plt.subplots(1,2,figsize=(7,3)) ax1 = plt.subplot(121) ax1.imshow(img,cmap="gray") ax1.axis("off") ax2 = plt.subplot(122) ax2.axis("off") ax2.imshow(result,cmap="gray") plt.show()
结果:
6. OpenCV实现傅里叶逆变换
6.1 OpenCV实现傅里叶逆变换函数
函数:返回结果=cv2.idft(原始数据)
- 返回结果:取决于原始数据的类型和大小
- 原始数据:实数或者复数均可以
函数:返回值=cv2.magnitude(参数1,参数2)
计算幅值。参数1:浮点型X坐标值,也就是实部;参数2:浮点型Y坐标值,也就是虚部。
dst(I)=x(I)2+y(I)2
6.2 代码实现
#%%OpenCV实现傅里叶逆变换函数 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r'C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\lena.bmp',cv2.IMREAD_GRAYSCALE) #进行傅里叶变换 dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT) #变换之后移动到中心 dftshift = np.fft.fftshift(dft) #移动到最初的位置 ishift = np.fft.ifftshift(dftshift) #逆变换 iimg = cv2.idft(ishift) iimg = cv2.magnitude(iimg[:,:,0],iimg[:,:,1]) fig,ax = plt.subplots(1,2,figsize=(7,3)) ax1 = plt.subplot(121) ax1.imshow(img,cmap="gray") ax1.axis("off") ax2 = plt.subplot(122) ax2.axis("off") ax2.imshow(iimg,cmap="gray") plt.show()
结果: