opencv python 傅里叶变换的使用

OpenCV-Python傅里叶变换的使用

傅里叶变换是一种将信号从时域转换到频域的方法,可以用于图像处理中的滤波、去噪、边缘检测等。OpenCV-Python提了cv.dft()cv2.idft()函数来实现傅里叶变换和反变换。本文将详细讲解OpenCV-P傅里变换的使用,并提供两个示例。

傅里叶变换

在OpenCV-Python中,我们可以使用cv2.dft()函数来实现傅里叶变换。cv2.dft()函数接受一个输入图像和一个标志参数,该参数指定傅里叶变换的类型。下面是一个使用cv2.dft()函数实现傅里叶变换的例代码:

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

# 读取图像
img = cv2.imread('lena.jpg', 0)

# 傅里叶变换
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)

# 将低频部分移到中心
dft_shift = np.fft.fftshift(dft)

# 取幅值
magnitude_spectrum = 20 * np.log(cv2.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()

上面的代码读取了一张灰度图像lena.jpg,然后使用cv2.dft()函数实现了傅里叶变换,并使用np.fft.fftshift()函数将频部分移动到中心,最后使用cv2.magnitude()函数取幅值。使用matplotlib库将原图和傅里叶变换后的图像显示出来。

反傅里叶变换

在OpenCVython中,我们可以使用cv2.idft()函数来实现反傅里叶变换。cv2.idft()函数接受一个输入图像和一个标志参数,该参数指定傅里叶变换的类型。下面是一个使用cv2.idft()函数实现反傅里叶变换示例代码:

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

# 读取图像
img = cv2.imread('lena.jpg', 0)

# 傅里叶变换
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)

# 将低频部分移动到中心
dft_shift = np.fft.fftshift(dft)

# 取幅值
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))

# 反傅里叶变换
idft = cv2.idft(dft,=cv2.DFT_SCALE | cv2.DFT_COMPLEX_OUTPUT)

# 取幅值
idft_mag = cv2.magnitude(idft[:, :, 0], idft[:, :, 1])

# 显示原图和反傅里叶变换后的图像
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(idft_mag, cmap='gray')
plt.title('IDFT Magnitude'), plt.xticks([]), plt.yticks([])
plt.show()

上面的代码读取了一张灰度图像lena.jpg,然后使用cv2.dft()函数实现了傅里叶变换,并使用np.fft.fftshift()将低频部分移动到中心,最后cv2.magnitude()函数取幅值。接着使用cv2.idft()函数实现反傅里叶变换,并使用cv2.magnitude()函数取幅值。使用matplotlib库将原图和反傅里变换后的图像显示出来。

示例一:使用傅里叶变换实现图像滤波

下面是一个使用傅里叶变换实现图像波的示例代码:

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

# 读取图像
img = cv2.imread('lena.jpg', 0)

# 傅里叶变换
dft = cv2.dft(np.float32(img), flags=cv.DFT_COMPLEX_OUTPUT)

# 将频部分移动到中心
dft_shift = np.fft.fftshift(dft)

# 创建一个掩膜
rows, cols = img.shape
crow, ccol = rows // 2, cols // 2
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow 30:crow + 30, ccol - 30:ccol + 30] = 1

# 应用掩膜
fshift = dft_shift * mask

# 将低频部分移回原位
f_ishift = np.fft.ifftshift(fshift# 反傅里叶变换
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])

# 显示原图和滤波后的图像
plt.subplot(121), plt.imshow(img, cmapgray')
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()

上面的代码读取了一张灰度图像lena.jpg,然后使用cv2.dft()函数实现了傅里叶变换,并使用np.fft.fftshift()函数将低频部分移动到中心。接着创建了一个掩膜,应用掩膜,将低频部分移回原位,最后使用cv2.idft()函数实现反傅里叶变换。使用matplotlib库将原图和滤波后的图像显示出来。

示例二:使用傅里叶变换实现图像去噪

下面是一个使用傅里叶变换实现图像去噪的示例代码:

import2
import numpy as np
from matplotlib import pyplot as plt

# 读取图像
img = cv2.imread('lena.jpg', 0)

# 添加高斯噪声
mean = 0
var = 100
sigma = var ** 0.5
gaussian = np.random.normal(mean, sigma, img.shape)
noisy_img = img + gaussian

# 傅里叶变换
dft = cv2.dft(np.float32(noisy_img), flags=cv2.DFT_COMPLEX_OUTPUT)

# 将低频部分移动到中心
dft_shift = np.fft.fftshift(dft)

# 创建一个掩膜
rows, cols = noisy_img.shape
crow, ccol = rows // 2, cols // 2
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 1

#用掩膜
fshift = dft_shift * mask

# 将低频部分移回原位
f_ishift = np.fft.ifftshift(fshift)

# 反傅里叶变换
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])

# 显示原图和去噪后的图像
plt.subplot(121), plt.imshow(noisy_img, cmap='gray')
plt.title('Noisy Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img_back, cmap='gray')
plt.title('Result'), plt.xticks([]), plt.yticks([])
plt.show()

上面的代码读取了一张灰度图像lena.jpg,然后添加了高斯噪声。接着使用cv2.dft()函数实现了傅里叶变换,并使用np.fft.fftshift()函数将低频部分移动到中心。接着创建了一个掩膜,应用掩膜,将低频分移回原位,最后使用cv2.idft()函数实现反傅里叶变换。使用matplotlib`库将原图和去噪后图像显示出来。

总结

本文详细讲解了OpenCV-Python傅里叶变换的使用,包括使用cv2.dft()函数实现傅里叶变换,使用cv2.idft()函数实现反傅里叶变换,以及使用傅里叶变换实现图像滤波和去噪。本文提供了两示例,分别演示了如何使用傅里叶变换实现图像滤波和去噪。掌握这些技巧可以帮助我们更好地处理图像处理中的滤波、去噪、边缘检测等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:opencv python 傅里叶变换的使用 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • python matplotlib画图库学习绘制常用的图

    Python Matplotlib画图库学习绘制常用的图 Matplotlib是Python中最常用的画图库之一,它可以绘制各种类型的图表,包括线图、散点、柱状图、饼图等。本文将详细讲解如何使用Matplotlib绘制常用的图表,并提供两个示例。 准备工作 在开始之前,需要安装Matplotlib库。可以使用以下命令来安装: pip install matp…

    python 2023年5月14日
    00
  • NDArray 与 numpy.ndarray 互相转换方式

    以下是关于“NDArray 与 numpy.ndarray 互相转换方式”的完整攻略。 NDArray 与 numpy.ndarray 的区别 在MXNet中,NDArray是一个维数组,类似Numpy中的ndarray。它是MXNet中最基本的数据结构之,用于存储和操作数据。而numpy.ndarray则是Numpy中多维数组,也是Python中最常用的数…

    python 2023年5月14日
    00
  • Python Flask搭建yolov3目标检测系统详解流程

    Python Flask 搭建 YOLOv3 目标检测系统详解流程 简介 YOLOv3 是一种目标检测算法,可以用于检测图像或视频中的物体。本攻略将介绍如何使用 Python Flask 搭建 YOLOv3 目标检测系统,包括如何使用 Flask 和 YOLOv3 进行示例说明。 环境准备 在开始之前,我们需要准备以下环境: Python 3.x Flask…

    python 2023年5月14日
    00
  • Ubuntu20.04环境安装tensorflow2的方法步骤

    安装TensorFlow 2.0需要以下步骤: 安装Anaconda或Miniconda 创建一个新的conda环境 安装TensorFlow 2.0 验证TensorFlow 2.0的安装 以下是详细的步骤: 安装Anaconda或Miniconda 首先,需要安装Anaconda或Miniconda。这里我们以Anaconda为例,可以从官网下载适合自己…

    python 2023年5月14日
    00
  • python numpy–数组的组合和分割实例

    Python NumPy – 数组的组合和分割实例 NumPy是Python中用于科学计算的一个重要的库,它提供了高效的多维数组array和与之相关的量。本文将详细讲解NumPy中的数组的组合和割实例,包括水组合、垂直组合、数组割等方法。 水平组合 使用NumPy中的hstack()函数可以将个数组水平组在一起,即将两个数组按列方向拼接。下面是一些示例: i…

    python 2023年5月14日
    00
  • Python利用subplots_adjust方法解决图表与画布的间距问题

    下面是关于“Python利用subplots_adjust方法解决图表与画布的间距问题”的完整攻略。 1. subplots_adjust方法 在Python中,使用matplotlib库绘制图表时,有时候会出现图表与画布之间的间距问题。这时候,可以使用subplots_adjust()方法调整图表与画布之间的间距。 subplots_adjust()方法的…

    python 2023年5月14日
    00
  • Python快速转换numpy数组中Nan和Inf的方法实例说明

    在Python中,当我们使用Numpy进行科学计算时,经常需要对数组中的NaN和Inf进行处理。下面是两种常见的处理方法: 方法一:使用numpy.nan_to_num函数 numpy.nan_to_num()函数将NaN和Inf替换为0和有限的数字。下面是一个示例: import numpy as np arr = np.array([1, 2, np.n…

    python 2023年5月13日
    00
  • NumPy数组的高级索引

    NumPy中的高级索引指的是使用整数数组或布尔数组来索引数组的方式,相较于基本索引(使用切片或整数索引),高级索引提供了更加灵活的方式来获取数组中的元素。下面我们来详细介绍一下NumPy中的高级索引。 整数数组索引 整数数组索引是指使用整数数组来作为索引的方式。例如,有一个二维数组a: import numpy as np a = np.array([[0,…

    2023年3月3日
    00
合作推广
合作推广
分享本页
返回顶部