Python图像处理【10】基于离散余弦变换的图像压缩

本文介绍了图像压缩的重要性,并详细探讨了离散余弦变换(DCT)的基础知识及其在图像压缩中的应用,特别是JPEG压缩。通过Python实现DCT,展示如何进行图像的DCT压缩和重建,以及简化版JPEG压缩过程,强调DCT在高效存储和传输图像数据中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 前言

由于图像中相邻像素间的相关性引起的空间冗余、图像序列中不同帧之间存在相关性引起的时间冗余,因此我们需要对图像数据进行压缩。数据压缩的目的就是通过去除这些数据冗余来减少数据表示所占用的存储空间。随着大数据时代的到来,图像数据在质量提高的同时,其大小也变得越来越大,在存储、传输、处理时非常困难,因此图像数据的压缩就显得非常重要。
图像压缩是数据压缩技术在图像上的应用,利用图像压缩可以减少图像数据中的冗余信息,从而能够更加高效存储和传输数据。在本节中,我们首先介绍离散余弦变换 (Discrete Cosine Transform, DCT) 的基本原理,利用 DCT 执行图像压缩操作,并实现图像 JPEG 压缩。

1. 离散余弦变换基础

离散余弦变换 (Discrete Cosine Transform, DCT) 以不同频率振幅的余弦函数组合表示图像,而离散傅里叶变换 (Discrete Fourier Transform, DFT) 则以复杂指数的形式使用正弦和余弦函数。以下方程式显示了如何计算

### 使用 Python 实现离散余弦变换DCT)进行图像处理 #### 方法概述 离散余弦变换 (Discrete Cosine Transform, DCT) 是一种常用的频域分析工具,广泛应用于图像压缩和处理领域。相比于离散傅里叶变换 (DFT),DCT 只涉及实数值计算,因此更适合实际应用中的数据表示[^3]。 在 Python 中可以利用 `scipy` 库来快速实现 DCT 和其逆变换 IDCT 的功能。以下是具体实现方式: --- #### 示例代码:基于 SciPy 的二维 DCT 图像处理 以下是一个完整的示例代码,展示如何加载一张灰度图像并对其进行 DCT 处理以及重建操作。 ```python import numpy as np from scipy.fftpack import dct, idct import matplotlib.pyplot as plt from skimage import io, color # 加载图像并转换为灰度图 image = io.imread('example_image.jpg') # 替换为你自己的图片路径 if image.ndim == 3: gray_image = color.rgb2gray(image) else: gray_image = image / 255.0 # 归一化到 [0, 1] # 显示原始图像 plt.figure(figsize=(10, 7)) plt.subplot(2, 2, 1), plt.imshow(gray_image, cmap='gray'), plt.title("Original Image") # 对图像执行二维 DCT dct_transformed = dct(dct(gray_image.T, norm='ortho').T, norm='ortho') # 显示 DCT 结果 plt.subplot(2, 2, 2), plt.imshow(np.log(abs(dct_transformed)), cmap='jet'), plt.title("DCT Coefficients (log scale)") # 截断高频部分以模拟 JPEG 压缩效果 threshold = 0.95 * abs(dct_transformed).max() # 设置阈值保留前 95% 幅度系数 dct_compressed = dct_transformed.copy() dct_compressed[np.abs(dct_compressed) < threshold] = 0 # 显示截断后的 DCT 系数分布 plt.subplot(2, 2, 3), plt.imshow(np.log(abs(dct_compressed)+1e-6), cmap='jet'), plt.title("Compressed DCT Coefficients (log scale)") # 执行逆 DCT 还原图像 idct_reconstructed = idct(idct(dct_compressed.T, norm='ortho').T, norm='ortho') idct_reconstructed = np.clip(idct_reconstructed, 0, 1) # 显示还原后的图像 plt.subplot(2, 2, 4), plt.imshow(idct_reconstructed, cmap='gray'), plt.title("Reconstructed Image") plt.tight_layout(), plt.show() ``` 此代码实现了以下几个步骤: 1. **读取与预处理**:将彩色图像转为灰度图,并归一化像素值至 `[0, 1]` 范围。 2. **DCT 正变换**:使用 `scipy.fftpack.dct` 函数完成二维正交标准化的 DCT 计算。 3. **频率截断**:通过设置幅度阈值去除高频分量,从而模拟图像压缩的效果。 4. **IDCT 逆变换**:恢复经过修改的 DCT 系数回空间域图像。 5. **可视化对比**:分别显示原始图像、DCT 频谱及其压缩版本的结果。 --- #### 关键点说明 - **正交规范化 (`norm='ortho'`)** 在调用 `dct()` 或 `idct()` 函数时指定参数 `norm='ortho'`,可确保变换矩阵具有单位范数性质,便于后续重构过程保持能量守恒关系[^2]。 - **日志尺度绘图** 绘制 DCT 系数直方图时常采用对数值形式(即 `np.log(abs(...))`),以便更清晰地观察低频区域集中现象。 - **误差控制** 数字信号处理过程中不可避免存在舍入误差;当尝试完全精确再现输入数据时需注意累积效应的影响[^1]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI technophile

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值