使用 Python 计算 8x8 DCT 变换系数保留数量与 PSNR 的关系
当使用 8x8 的二维 DCT 变换系数矩阵时,保留不同数量系数的重构图像与原始图像的 PSNR 值的完整代码如下:
import numpy as np
import cv2
from skimage.metrics import peak_signal_noise_ratio
# 加载原始图像并将其转换为灰度
image = cv2.imread('original_image.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 进行 8x8 二维 DCT 变换
dct_image = cv2.dct(np.float32(gray_image))
dct_coefficients = np.abs(dct_image)
# 保留不同数量的系数并进行逆 DCT 变换,计算 PSNR 值
keep_coefficients = [1, 2, 4, 6, 8, 10] # 保留的系数数量
psnr_values = []
for num_coefficients in keep_coefficients:
# 设置系数
modified_coefficients = np.zeros((8, 8))
for i in range(8):
for j in range(8):
if i+j < num_coefficients:
modified_coefficients[i, j] = dct_coefficients[i, j]
# 逆 DCT 变换
modified_image = cv2.idct(modified_coefficients)
# 计算 PSNR
psnr = peak_signal_noise_ratio(gray_image, modified_image)
psnr_values.append(psnr)
# 打印结果
print('保留系数数量 PSNR 值')
for i in range(len(keep_coefficients)):
print(f'{keep_coefficients[i]} {psnr_values[i]}')
请确保将代码中的 'original_image.jpg' 替换为你的原始图像文件路径。运行代码后,将会打印出不同保留系数数量下的 PSNR 值。
原文地址: https://www.cveoy.top/t/topic/ckpO 著作权归作者所有。请勿转载和采集!