Python 使用 OpenCV 进行二维离散傅里叶变换 (DFT) - 8x8 分块实现
使用 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, '秒')
代码解释
-
导入库
numpy用于数组操作cv2用于图像处理time用于计时matplotlib.pyplot用于显示图像
-
加载图像
- 指定 BMP 图像路径
- 使用
cv2.imread加载图像,并使用cv2.IMREAD_GRAYSCALE将图像转换为灰度图像 height和width分别获取图像的高度和宽度
-
分块 8x8 的二维 DFT 变换
- 创建一个与原始图像大小相同的全零数组
dft_image,用于存储 DFT 图像 - 使用嵌套的循环遍历图像,每次选取 8x8 的块
- 将每个块转换为
np.float32类型,并使用cv2.dft进行二维 DFT 变换 cv2.dft输出的结果是复数形式的,使用cv2.magnitude函数计算幅度谱,并将其赋值给对应的位置
- 创建一个与原始图像大小相同的全零数组
-
对 DFT 图像进行归一化处理
- 将 DFT 图像进行归一化处理,使其值范围在 0 到 255 之间,以便更好地显示和保存
- 使用
cv2.normalize函数进行归一化,参数alpha和beta分别指定输出图像的最小值和最大值
-
计算 DFT 变换的总时间
- 计算结束时间减去开始时间
-
显示原始图像和 DFT 图像
- 使用
matplotlib.pyplot库的subplot函数将原始图像和 DFT 图像显示在同一个窗口中 - 设置图像的标题
- 使用
imshow函数显示图像
- 使用
-
保存灰度图像
- 将归一化后的 DFT 图像保存为灰度图像
- 使用
cv2.imwrite函数,指定输出路径
-
统计计算时间
- 输出 DFT 变换的计算时间
总结
本文详细介绍了使用 OpenCV 库进行二维离散傅里叶变换 (DFT) 的步骤,并重点讲解了如何将图像分块成 8x8 块进行处理。通过代码示例和详细解释,你可以更好地理解 DFT 的原理和实现过程。希望本文对你有所帮助!
原文地址: https://www.cveoy.top/t/topic/bsIY 著作权归作者所有。请勿转载和采集!