使用 OpenCV 进行二维离散傅里叶变换 (DFT) - 8x8 分块实现

本文将详细介绍使用 Python 和 OpenCV 库对图像进行二维离散傅里叶变换 (DFT) 的步骤,并重点讲解如何将图像分块成 8x8 块进行处理。代码示例清晰易懂,并提供详细的代码注释,帮助你了解 DFT 的原理和实现过程。

代码示例

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

# 加载 BMP 图像
image_path = 'your_image.bmp'  # 替换为实际的 BMP 图像路径
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
height, width = image.shape

# 分块 8x8 的二维 DFT 变换
dft_image = np.zeros_like(image, dtype=np.float32)
start_time = time.time()
for i in range(0, height, 8):
    for j in range(0, width, 8):
        block = np.float32(image[i:i+8, j:j+8])
        dft_block = cv2.dft(block, flags=cv2.DFT_COMPLEX_OUTPUT)
        dft_image[i:i+8, j:j+8] = cv2.magnitude(dft_block[:, :, 0], dft_block[:, :, 1])

# 对 DFT 图像进行归一化处理
dft_image_normalized = cv2.normalize(dft_image, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)

end_time = time.time()
total_time = end_time - start_time

# 显示原始图像和 DFT 图像
plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')

plt.subplot(1, 2, 2)
plt.imshow(dft_image_normalized, cmap='gray')
plt.title('DFT Image')

plt.show()

# 保存灰度图像
output_path = 'output.bmp'  # 替换为保存输出图像的路径
cv2.imwrite(output_path, dft_image_normalized)

# 统计计算时间
print('计算时间:', total_time, '秒')

代码解释

  1. 导入库

    • numpy 用于数组操作
    • cv2 用于图像处理
    • time 用于计时
    • matplotlib.pyplot 用于显示图像
  2. 加载图像

    • 指定 BMP 图像路径
    • 使用 cv2.imread 加载图像,并使用 cv2.IMREAD_GRAYSCALE 将图像转换为灰度图像
    • heightwidth 分别获取图像的高度和宽度
  3. 分块 8x8 的二维 DFT 变换

    • 创建一个与原始图像大小相同的全零数组 dft_image,用于存储 DFT 图像
    • 使用嵌套的循环遍历图像,每次选取 8x8 的块
    • 将每个块转换为 np.float32 类型,并使用 cv2.dft 进行二维 DFT 变换
    • cv2.dft 输出的结果是复数形式的,使用 cv2.magnitude 函数计算幅度谱,并将其赋值给对应的位置
  4. 对 DFT 图像进行归一化处理

    • 将 DFT 图像进行归一化处理,使其值范围在 0 到 255 之间,以便更好地显示和保存
    • 使用 cv2.normalize 函数进行归一化,参数 alphabeta 分别指定输出图像的最小值和最大值
  5. 计算 DFT 变换的总时间

    • 计算结束时间减去开始时间
  6. 显示原始图像和 DFT 图像

    • 使用 matplotlib.pyplot 库的 subplot 函数将原始图像和 DFT 图像显示在同一个窗口中
    • 设置图像的标题
    • 使用 imshow 函数显示图像
  7. 保存灰度图像

    • 将归一化后的 DFT 图像保存为灰度图像
    • 使用 cv2.imwrite 函数,指定输出路径
  8. 统计计算时间

    • 输出 DFT 变换的计算时间

总结

本文详细介绍了使用 OpenCV 库进行二维离散傅里叶变换 (DFT) 的步骤,并重点讲解了如何将图像分块成 8x8 块进行处理。通过代码示例和详细解释,你可以更好地理解 DFT 的原理和实现过程。希望本文对你有所帮助!

Python 使用 OpenCV 进行二维离散傅里叶变换 (DFT) - 8x8 分块实现

原文地址: https://www.cveoy.top/t/topic/bsIY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录