OpenCV技术应用实战

8.0傅里叶变化

实现结果:

检测

源码:

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

#基本的傅里叶变换
def burBase():
    # 第一步读取图像
    img=cv2.imread("./image/lena.jpg",0)
    #1.数据变为float32的类型
    img_float=np.float32(img)
    # 第三步: 使用 cv2.dft 进行傅里叶变换
    dft=cv2.dft(img_float,flags=cv2.DFT_COMPLEX_OUTPUT)
    # 第四步:使用 np.fft.shiftfft()将变换后的图像的低频转移到中心位置
    dft_shift=np.fft.fftshift(dft)
    # 第五步:使用 cv2.magnitude 将实部和虚部转换为实部,乘以 20 是为了使得结果更大
    mag_ape = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
    #6.显示,1行2列,第一张121.
    plt.subplot(121),plt.imshow(img,cmap='gray')
    plt.subplot(122), plt.imshow(mag_ape, cmap='gray')
    plt.show()

#使用傅里叶变换实现低通滤波
def fourier_idft():
    # 第一步读取图像
    img = cv2.imread("./image/lena.jpg", 0)
    # 1.数据变为float32的类型
    img_float = np.float32(img)
    # 第三步: 使用 cv2.dft 进行傅里叶变换
    dft = cv2.dft(img_float, flags=cv2.DFT_COMPLEX_OUTPUT)
    # 第四步:使用 np.fft.shiftfft()将变换后的图像的低频转移到中心位置
    dft_shift = np.fft.fftshift(dft)
    # 第五步:使用 cv2.magnitude 将实部和虚部转换为实部,乘以 20 是为了使得结果更大
    mag_ape = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
    #6.构建mask
    row,col=int(img.shape[0]/2),int(img.shape[1]/2)
    mask=np.zeros((img.shape[0],img.shape[1],2),np.uint8)
    mask[row-30:row+30,col-30:col+30]=1
    # 7.掩模和傅里叶结果乘法运算
    mask_img = dft_shift* mask
    # 8.反向复位
    mask_ape = 20 * np.log(cv2.magnitude(mask_img[:, :, 0], mask_img[:, :, 1]))
    # 使用 np.fft.iffshift 将低频移动到原来的位置
    img_idf = np.fft.ifftshift(mask_img)
    # 使用 cv2.idft 进行傅里叶的反变换
    img_idf = cv2.idft(img_idf)
    # 使用 cv2.magnitude 转换为空间域内
    img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1])
    # 显示图像
    plt.subplot(221),plt.imshow(mag_ape, cmap='gray')
    plt.subplot(222),  plt.imshow(mask_ape, cmap='gray')
    plt.subplot(223),plt.imshow(img, cmap='gray')
    plt.subplot(224),plt.imshow(img_idf, cmap='gray')
    plt.show()

#使用傅里叶变换实现高通滤波
def fourier_hdft():
    # 读取图像
    img = cv2.imread("./image/lena.jpg", 0)
    # 进行 float32 形式转换
    img_float = np.float32(img)
    # 使用 cv2.dft 进行傅里叶变换
    dft = cv2.dft(img_float, flags=cv2.DFT_COMPLEX_OUTPUT)
    # 使用 np.fft.shiftfft()将变换后的图像的低频转移到中心位置
    dft_center = np.fft.fftshift(dft)
    # 使用 cv2.magnitude 将实部和虚部转换为实部,乘以 20 是为了使得结果更大,用于显示
    mag_ape = 20 * np.log(cv2.magnitude(dft_center[:, :, 0], dft_center[:, :, 1]))
    # 定义掩模,生成掩模中间为 1 周围为 0
    row, col = int(img.shape[0] / 2), int(img.shape[1] / 2)
    mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8)
    mask[row - 10:row + 10, col - 10:col + 10] = 0
    # 掩模和傅里叶结果乘法运算
    mask_img = dft_center * mask
    # 掩模后的结果使用 cv2.magnitude 将实部和虚部转换为实部,乘以 20 是为了使得结果更大,用于显示
    mask_ape = 20 * np.log(cv2.magnitude(mask_img[:, :, 0], mask_img[:, :, 1]))
    # 使用 np.fft.iffshift 将低频移动到原来的位置
    img_idf = np.fft.ifftshift(mask_img)
    # 使用 cv2.idft 进行傅里叶的反变换
    img_idf = cv2.idft(img_idf)
    # 使用 cv2.magnitude 转换为空间域内
    img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1])
    # 显示图像
    plt.subplot(221),plt.imshow(mag_ape, cmap='gray')
    plt.subplot(222),plt.imshow(mask_ape, cmap='gray')
    plt.subplot(223),plt.imshow(img, cmap='gray')
    plt.subplot(224),plt.imshow(img_idf, cmap='gray')
    plt.show()





if __name__ == '__main__':
    # burBase()
    # fourier_idft()
    fourier_hdft()

解析:

  • 导入模块

    • import cv2:导入 opencv 库,用于图像处理操作。
    • import numpy as np:导入 numpy 库并使用 np 作为别名,用于处理数组数据。
    • from matplotlib import pyplot as plt:导入 matplotlib 的 pyplot 模块,用于图像显示。
    • import math:导入 math 库,用于数学计算。
  • 函数定义

    • burBase()

      • 功能:对图像进行基本的傅里叶变换并显示结果。
      • 实现:
        • 读取图像 ./image/lena.jpg 并转换为灰度图像。
        • 将图像数据类型转换为 np.float32
        • 使用 cv2.dft 进行傅里叶变换。
        • 使用 np.fft.fftshift 将低频部分移到中心。
        • 使用 cv2.magnitude 将傅里叶变换结果的实部和虚部转换为幅值,并乘以 20 进行放大。
        • 使用 plt.subplot 和 plt.imshow 显示原始图像和变换后的幅值图像。
    • fourier_idft()

      • 功能:使用傅里叶变换实现低通滤波。
      • 实现:
        • 读取图像 ./image/lena.jpg 并转换为灰度图像。
        • 将图像数据类型转换为 np.float32
        • 使用 cv2.dft 进行傅里叶变换。
        • 使用 np.fft.fftshift 将低频部分移到中心。
        • 使用 cv2.magnitude 将傅里叶变换结果的实部和虚部转换为幅值,并乘以 20 进行放大。
        • 构建低通滤波的掩模,中心为 1,其余为 0。
        • 将掩模与傅里叶变换结果相乘。
        • 使用 np.fft.ifftshift 将低频部分移回原位。
        • 使用 cv2.idft 进行反傅里叶变换。
        • 使用 cv2.magnitude 将反变换结果的实部和虚部转换为幅值。
        • 使用 plt.subplot 和 plt.imshow 显示傅里叶变换幅值图像、掩模后的幅值图像、原始图像和滤波后的图像。
    • fourier_hdft()

      • 功能:使用傅里叶变换实现高通滤波。
      • 实现:
        • 读取图像 ./image/lena.jpg 并转换为灰度图像。
        • 将图像数据类型转换为 np.float32
        • 使用 cv2.dft 进行傅里叶变换。
        • 使用 np.fft.fftshift 将低频部分移到中心。
        • 使用 cv2.magnitude 将傅里叶变换结果的实部和虚部转换为幅值,并乘以 20 进行放大。
        • 构建高通滤波的掩模,中心为 0,其余为 1。
        • 将掩模与傅里叶变换结果相乘。
        • 使用 np.fft.ifftshift 将低频部分移回原位。
        • 使用 cv2.idft 进行反傅里叶变换。
        • 使用 cv2.magnitude 将反变换结果的实部和虚部转换为幅值。
        • 使用 plt.subplot 和 plt.imshow 显示傅里叶变换幅值图像、掩模后的幅值图像、原始图像和滤波后的图像。
  • 主程序部分:

    • if __name__ == '__main__':

      • 功能:确保代码作为脚本运行时执行相应的函数。
      • 调用 fourier_hdft() 函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值