Python实现BMP图像的二维DFT变换及性能分析
Python实现BMP图像的二维DFT变换及性能分析
本篇文章将介绍如何使用Python对BMP图像进行8x8二维DFT变换,并对代码进行详细解释。
import numpy as np
import cv2
import time
# 加载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图像
cv2.imshow('DFT Image', dft_image_normalized)
cv2.waitKey(0)
# 对DFT图像进行对数变换和归一化处理
dft_image_log = np.log1p(dft_image)
dft_image_log_normalized = cv2.normalize(dft_image_log, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
# 显示DFT图像(对数变换后)
cv2.imshow('DFT Image (Log)', dft_image_log_normalized)
cv2.waitKey(0)
# 保存灰度图像
output_path = 'output.bmp' # 替换为保存输出图像的路径
cv2.imwrite(output_path, dft_image_normalized)
# 统计计算时间
print('计算时间:', total_time, '秒')
代码解释:
-
导入必要的库:
numpy用于数值计算cv2用于图像处理time用于计时
-
加载图像:
- 使用
cv2.imread()加载BMP图像,并将其转换为灰度图像。
- 使用
-
执行8x8二维DFT变换:
- 使用循环遍历图像的每个8x8块。
- 使用
cv2.dft()函数对每个块执行DFT变换。 - 使用
cv2.magnitude()函数计算DFT变换的幅度谱。
-
归一化DFT图像:
- 使用
cv2.normalize()函数将DFT图像的像素值归一化到0-255之间,以便于显示。
- 使用
-
显示和保存DFT图像:
- 使用
cv2.imshow()函数显示DFT图像。 - 使用
cv2.imwrite()函数将DFT图像保存到文件。
- 使用
-
对数变换:
- 对DFT图像进行对数变换,可以更好地显示低频信息。
-
性能分析:
- 使用
time.time()函数记录DFT变换的计算时间。
- 使用
使用方法:
- 将代码保存为Python文件 (例如:
dft_transform.py)。 - 将
your_image.bmp替换为实际的BMP图像路径,并将output.bmp替换为保存输出图像的路径。 - 在命令行中运行代码:
python dft_transform.py
运行代码后,将显示原始DFT图像和经过对数变换后的DFT图像,并在控制台上输出计算时间。
原文地址: https://www.cveoy.top/t/topic/br8g 著作权归作者所有。请勿转载和采集!