离散余弦正逆变换

本文纠正了网上关于离散余弦正逆变换的错误信息,提供了严格遵循公式的C++代码实现,确保经过DCT和IDCT后的图像数据能够恢复到原始状态。代码未进行优化,适用于理解DCT和IDCT原理。

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

最近网上有朋友因为要进行图像处理,而问及离散余弦正逆变换的问题,我在网上找了一些资料,网下也找了一些参考书,发现居然有很多错误,尤其是逆变换(IDCT)的公式都是错的!怪不得网友做完DCT后,再IDCT,却得不到原来的初始数据了(四舍五入的误差除外),实在误人甚深。写此博文,以正其谬。

 

说明:

下面实现的代码,严格遵循离散余弦正逆变换的公式,仅供理解离散余弦逆变换的原理而写。并未考虑代码优化,也未考虑快速算法,快速算法见快速离散余弦变换代码实现(FDCT) 快速逆离散余弦变换代码实现(FIDCT)

离散余弦变换(DCT)公式:

 

 

离散余弦逆变换(IDCT)公式:

 

 

注:严格的离散余弦变换公式中,其中一个N可以写为M,且MN可以不相等。这里由于为图像处理服务,所以都写成了N

 

代码实现:

#include <iostream>

#include <math.h>

using namespace std;

 

#define NUM 8

#define PI 3.1415926

 

short round(double a)

{

         if (a >= 0)

         {

                   return (short)(a + 0.5);

         }

         else

         {

                   return (short)(a - 0.5);

         }

}

 

// DCT - Discrete Cosine Transform

void DCT(short data[NUM][NUM])

{

 

         short output[NUM][NUM];

         double ALPHA, BETA;

 

         short u = 0;

         short v = 0;

         short i = 0;

         short j = 0;

 

         for(u = 0; u < NUM; u++)

         {

                   for(v = 0; v < NUM; v++)

                   {

                            if(u == 0)

               &nb

### 离散余弦变换及其逆变换原理 离散余弦变换(Discrete Cosine Transform, DCT)是一种用于信号处理和数据分析的技术,尤其适用于图像和音频压缩领域。DCT能够将空间域的数据转换成频率域表示形式,在此过程中可以有效地分离出数据的主要特征。 对于二维情况下的8×8块而言,FDCT(前向离散余弦变换)负责把输入的空间域样本映射至频谱系数;而IDCT(逆离散余弦变换),则相反地执行这一操作——即由频谱系数重构原始的空间域样本[^1]。 值得注意的是,尽管通过DCT可以获得更紧凑的能量分布,但这一步骤本身并不会直接导致数据量减小。真的压缩效果来自于随后进行的量化环节以及熵编码等进一步措施。具体来说,在量化阶段会对较高阶次的交流分量施加不同程度的影响来达到降低存储需求的目的[^2]。 ### 使用Python实现离散余弦变换与逆变换 下面给出一段基于OpenCV库完成图片上DCT及IDCT运算的例子: ```python import numpy as np import cv2 from matplotlib import pyplot as plt def show_images(images, titles=None): n = len(images) fig, axs = plt.subplots(1, n, figsize=(15, 5)) for i in range(n): ax = axs[i] ax.imshow(cv2.cvtColor((images[i]*255).astype(np.uint8), cv2.COLOR_GRAY2RGB)) if titles is not None and isinstance(titles, list) and len(titles)>i: ax.set_title(titles[i]) plt.show() img_gray = cv2.imread('path_to_image', cv2.IMREAD_GRAYSCALE)/255. f = np.fft.fftshift(img_gray) dct_img = cv2.dct(f.astype(np.float32)) # 将高频部分设为零以模拟简单的量化过程 quantized_dct = dct_img.copy() threshold = 0.1 * abs(dct_img.max()) quantized_dct[np.abs(quantized_dct)<threshold]=0. idct_img = cv2.idct(quantized_dct) show_images([img_gray,idct_img], ['Original Image','Reconstructed from Quantized DCT']) ``` 上述代码片段展示了如何读取灰度图像并对其进行快速傅立叶变换后的中心化处理,接着计算该图像对应的离散余弦变换结果,并对所得矩阵实施简化版的量化策略(即将绝对值小于一定阈值的位置清零)。最后再利用`cv2.idct()`函数完成从量化后的DCT系数到近似还原图像的过程[^3]。 而对于一维时间序列比如声音信号,则有如下例子说明怎样运用相同的方法来进行分析: ```python import numpy as np import cv2 import matplotlib.pyplot as plt xn = np.random.randn(100,) # 随机生成测试用的一维数组作为“语音” ds_dct = cv2.dct(xn.astype(np.float32)) ds_idct = cv2.idct(ds_dct) plt.figure(figsize=(8, 6)) plt.subplot(311) plt.plot(xn) plt.xlabel('Sample Points') plt.title('Original Signal') plt.subplot(312) plt.plot(ds_dct.real) plt.xlabel('Frequency Domain Index') plt.title('After Discrete Cosine Transformation') plt.subplot(313) plt.plot(ds_idct.real) plt.xlabel('Sample Points After Reconstruction') plt.title('Recovered by Inverse Discrete Cosine Transformation') plt.tight_layout() plt.show() ``` 这段脚本创建了一个随机的时间序列代表所谓的“语音”,然后依次对其进行了离散余弦变换(DCT)、设置一些参数后又做了相应的逆变换(IDCT),并通过图形界面直观展现了这三个不同状态下的波形变化趋势[^4]。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值