数字图像处理课程实习——傅里叶变换与频域滤波

        本次实验的目标主要是为了为了学会使用傅里叶变换将图像由空间域变到频率域,并设计和使用理想低通滤波器、理想高通滤波器和巴特沃斯低通滤波器来对图像在频域范围进行处理,而后进行逆傅里叶变换,最终得到空间域里被滤波器处理过的图像。

        本次实验主要完成了使用python语言读取图像并对其进行傅里叶变换、频谱平移,设计了理想低通、高通滤波器和巴特沃斯低通滤器并对频谱图像进行滤波处理,而后进行了逆频谱平移和逆傅里叶变换得到了空间域中被不同滤波器处理过后的图像,同时进行改变截止频率大小的操作来观察不同截止频率对图像滤波效果的影响。

代码:

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


def main():
    grayimg = cv2.imread('camera.png', cv2.IMREAD_GRAYSCALE)
    #原始图像显示在画布的一号位
    plt.subplot(331), plt.imshow(grayimg, cmap='gray'), plt.title('original img'), plt.axis('off')
    #转换数据类型
    grayimg = np.float64(grayimg / 255.0)
    #进行傅里叶变化
    f = np.fft.fft2(grayimg)
    magnitude_spectrum1 = np.log(np.abs(f) + 1)
    #显示傅里叶变换后的平移前的频谱图像
    plt.subplot(332), plt.imshow(magnitude_spectrum1, cmap='gray'), plt.title('FFT before shift'),plt.axis('off')
    #进行频谱平移
    fshift = np.fft.fftshift(f)
    magnitude_spectrum2 = np.log(np.abs(fshift) + 1)
    # 显示傅里叶变换后的平移后的频谱图像
    plt.subplot(333), plt.imshow(magnitude_spectrum2, cmap='gray'), plt.title('FFT after shift'),plt.axis('off')
    # 找到中心位置
    rows, cols = grayimg.shape
    crow, ccol = int(rows / 2), int(cols / 2)

    # 理想低通滤波器
    # 设计截止频率
    D0 = 100
    #返回一个给定形状和类型的用0填充的数组
    mask = np.zeros((rows, cols), np.float32)
    #遍历元素
    for i in range(rows):
        for j in range(cols):
            if (i - crow) ** 2 + (j - ccol) ** 2 <= D0 ** 2:
                mask[i, j] = 1.0#低频部分赋值为1

    # 理想高通滤波器
    #设计截止频率
    D1 = 100
    #返回一个给定形状和类型的用1填充的数组
    mask2 = np.ones((rows, cols), np.float32)
    #遍历元素
    for i in range(rows):
        for j in range(cols):
            if (i - crow) ** 2 + (j - ccol) ** 2 <= D1 ** 2:
                mask2[i, j] = 0.0#低频部分赋值为0


    #巴特沃斯低通滤波器
    #设计截止频率
    D2=100
    #设计巴特沃斯低通滤波器阶数
    n=2
    #返回一个给定形状和类型的用1填充的数组
    mask3=np.ones((rows,cols),np.float32)
    #遍历元素
    for i in range(rows):
        for j in range(cols):
            mask3[i,j]=1/(1+(math.sqrt((i-crow)**2+(j-ccol)**2)/D2)**(2*n))#赋值

    #用理想低通滤波器掩膜与频谱图像相乘实现低通滤波
    m_fshift = fshift * mask
    #用理想高通滤波器掩膜与频谱图像相乘实现高通滤波
    m_fshift2 = fshift * mask2
    #用巴特沃斯低通滤波器掩膜与频谱图像相乘实现巴特沃斯低通滤波
    m_fshift3 = fshift * mask3

    #分别对三幅处理后的频谱图进行逆频谱平移
    ishift = np.fft.ifftshift(m_fshift)
    ishift2 = np.fft.ifftshift(m_fshift2)
    ishift3 = np.fft.ifftshift(m_fshift3)

    #分别对三幅频谱图进行逆傅里叶变换
    iimg = np.fft.ifft2(ishift)
    iimg2 = np.fft.ifft2(ishift2)
    iimg3 = np.fft.ifft2(ishift3)

    #使用 np.abs ()函数取逆变换后复数的模构成灰度图像
    iimg = np.abs(iimg)
    iimg2 = np.abs(iimg2)
    iimg3 = np.abs(iimg3)

    #显示三个掩膜和它们处理后的图像
    plt.subplot(334), plt.imshow(mask, cmap='gray'), plt.title('low pass filter'), plt.axis('off')
    plt.subplot(337), plt.imshow(iimg, cmap='gray'), plt.title('low pass filterd image'), plt.axis('off')
    plt.subplot(335), plt.imshow(mask2, cmap='gray'), plt.title('high pass filter'), plt.axis('off')
    plt.subplot(338), plt.imshow(iimg2, cmap='gray'), plt.title('high pass filterd image'), plt.axis('off')
    plt.subplot(336), plt.imshow(mask3, cmap='gray'), plt.title('butterworth filter'), plt.axis('off')
    plt.subplot(339), plt.imshow(iimg3, cmap='gray'), plt.title('butterworth filterd image'), plt.axis('off')
    plt.show()

if __name__ == '__main__':
    main()

观察并分析不同滤波器、不同截止频率对图像滤波效果的影响。

        理想低通滤波器允许低频成分通过,而抑制高频成分,故其能去除图像中的噪声,实现图像平滑操作,但同时也不可避免地会引起图像模糊;

        理想高通滤波器与低通滤波器相反,它允许高频成分通过,而抑制低频成分,故其能强化图像中目标的边缘,实现图像锐化操作,但同时也会不可避免地强化图像中的噪声;

        理想低通滤波器因变换函数具有陡峭的变化,便会使得输出图像在灰度剧烈变化处产生振荡,即“振铃”;而使用巴特沃斯低通滤波器可以较好地抑制“振铃”现象。

        对于低通滤波来讲,截止频率变大,会使得滤除的能量越来越少,平滑的效果会减弱,但同时模糊现象也会越来越轻;对于高通滤波来讲,截止频率变大,会使得滤除的能量越来越多,锐化的效果会增强。 

实验分析与日志

  1. 通过编程实习,我对于二维傅里叶变换的卷积定理有了更深刻的认识,在实际代码中就是将滤波器掩膜与频谱图像相乘,而对应空间域中将滤波器掩膜与图像做卷积运算;
  2. 写巴特沃斯低通滤波掩膜时应注意多重小括号的层次关系,把数学表达式写正确;
  3. 理想低通滤波器的截止频率选择不恰当时,会有很强的振铃效应,故需要选择合适的截止频率;
  4. 不同截止频率的滤波器掩膜所产生的图像处理效果不同,通过实验结果可以看出巴特沃斯滤波器的效果会比理想滤波器要好,尤其体现在其可以应对理想滤波器所存在的明显的振铃现象。

你可能感兴趣的:(数字图像处理学习专栏,计算机视觉,opencv,python,pycharm,图像处理)