想象你是一位收纳师,面对一只 8×8 格的衣柜,里面挤着 64 件衣物——每件衣服的款式和颜色就是图像里的一个个像素。直接硬塞进行李箱,又重又乱;但如果你换个思路:先别管每件衣服长什么样,而是用几把“风格尺子”给整个柜子打分——第 0 把尺子量“整体素净度”,第 1 把量“左浅右深的渐变程度”,第 2 把量“中间竖条高亮程度”……这就是离散余弦变换(DCT)的直觉。更妙的是,打完分你会发现:真正撑起整个衣柜气场的,往往只有头几个“百搭款”分数,那些花哨款分数几乎可以忽略。于是你果断扔掉花哨款,行李箱轻松合上,打开时还几乎看不出差别——这就是 DCT 压缩的秘密。JPEG 图像、MP3 音乐,背后都是这套“先打分、再取舍”的收纳哲学。

岗位关联

掌握 DCT 是理解 JPEG/MP3 等一切主流压缩算法的钥匙。对 AI 从业者而言,无论做数据分析、图像预处理还是模型部署,懂得如何高效压缩信号,都是基本功。

目录
  1. 可视化演示
  2. DCT定义原理——给衣柜打分
  3. 能量集中特性——百搭款撑起整个气场
  4. DCT与DFT比较——为什么不选傅里叶折叠法
  5. 图像压缩流程——打包的标准四步
  6. JPEG编码流程——把清单写得更聪明
  7. 压缩质量分析——取舍的艺术
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示DCT-II将时域信号变换为频域系数、能量集中于低频的能量压缩特性、以及JPEG 8x8块量化压缩流程。切换步骤查看各阶段。

本节配有交互动效(进入视口后自动加载,约 3KB)。

DCT-II变换:时域到频域映射 DCT-II将N点实数序列变换为N个实数频域系数:X(k)=α(k)Σx(n)cos[π/N(n+1/2)k],仅用余弦基函数,结果为纯实数,避免DFT的复数运算 正交归一化使C·C^T=I,满足Parseval定理能量守恒;DCT可通过对信号半采样点偶对称延拓后做DFT推导,边界连续性优于DFT的周期延拓 X(k) = α(k) Σ_{n=0}^{N-1} x(n) cos[π/N (n+1/2) k], α(0)=√(1/N), α(k>0)=√(2/N) DCT-II是JPEG/MP3压缩的核心变换

DCT定义原理——给衣柜打分

收纳师小林接手一只 8×8 的收纳格,里面装着 64 件衣物,每件衣物的款式颜色就是图像里的一个像素灰度值。为了记住整个格子的观感,她不必逐一记录每件衣物,而是改用一套“风格尺子”逐把测量:第 0 把尺子量“整体素净度”,第 1 把量“左浅右深的渐变程度”,第 2 把量“中间竖条高亮程度”……每一把尺子的形状都是一条余弦波,量出的分数就是 DCT 系数。

所谓“打分”,在数学上就是把 64 个像素值与 64 个余弦图案分别求内积。其中使用最广的是 DCT-II 变换,它把长度为 N 的一维信号表达成 N 个余弦基函数的加权和。一维 DCT-II 公式如下:

小林记下这 64 个分数,比记下 64 件衣服的款式高效得多——因为后面她会发现,真正有用的分数往往只有前面几个。

Xk=∑n=0N−1xncos⁡[πN(n+12)k],k=0,1,…,N−1X_k = \sum_{n=0}^{N-1} x_n \cos\left[\frac{\pi}{N}\left(n+\frac12\right)k\right], \quad k=0,1,\ldots,N-1
通俗理解:x_n 是原始信号序列,X_k 是第 k 个频率系数。当 k=0 时,余弦项恒为 1,X_0 就是整段信号的平均值(直流分量)。
  1. 信号采样点 x_n原始序列中第 n 个位置的值,比如一维音频里第 n 个采样点的振幅,或图像某一行像素中第 n 个亮度值。
    xn,n=0,1,…,N−1x_n,\quad n=0,1,\ldots,N-1
  2. 余弦基函数第 k 个“尺子”在位置 n 处的刻度,频率随 k 增大而升高,k=0 时是一条水平直线。
    cos⁡[πN(n+12)k]\cos\left[\frac{\pi}{N}\left(n+\frac12\right)k\right]
  3. 加权求和把每个采样点与对应刻度相乘后累加,相当于求信号在这把“尺子”上的投影大小,也就是两者的相似度。
    ∑n=0N−1(⋯ )\sum_{n=0}^{N-1}(\cdots)
  4. 频域系数 X_k第 k 个频率成分的强度。k=0 对应直流(平均值),k 越大对应变化越快的高频细节。
    XkX_k

能量集中特性——百搭款撑起整个气场

小林把 64 个分数按顺序排开,惊讶地发现:第 0、第 1、第 2 个分数都很大,越往后分数越小,到第 30 个以后几乎趋近于零。整个收纳格的“视觉气场”基本由头几个百搭款撑起;花哨款数量虽多,存在感却极低。

在信号处理里,这叫作“能量集中”(energy compaction)。把每个系数的平方看作它携带的能量,对自然图像做 DCT 变换后,绝大多数能量都落在低频系数上——也就是素色、渐变这类大面积平缓变化的部分;高频系数对应边缘、纹理和噪点,数值通常很小。因为人眼对高频细节不敏感,丢掉它们并不会造成明显的观感损失,这就是感知冗余。

为了量化这个特性,我们定义能量保留率:

这就是 DCT 能压缩的物理基础:既然 90% 的能量能用 10% 的系数表示,剩下的系数就可以放心大胆地舍弃或粗略记录。

E(K)=∑k=0K−1∣Xk∣2∑k=0N−1∣Xk∣2E(K) = \frac{\sum_{k=0}^{K-1} |X_k|^2}{\sum_{k=0}^{N-1} |X_k|^2}
通俗理解:如果只保留前 K 个系数、把后面的系数全扔掉,信号总能量能留下多少百分比。对典型图像块,K 取 1~4 时 E(K) 就能轻松超过 90%。
  1. 单个系数能量第 k 个系数的平方,衡量这个频率成分的“体积”。
    ∣Xk∣2|X_k|^2
  2. 分子·保留的能量只加总前 K 个低频系数的能量。
    ∑k=0K−1∣Xk∣2\sum_{k=0}^{K-1}|X_k|^2
  3. 分母·总能量全部 N 个系数的能量总和,由帕斯瓦尔定理可知它等于时域信号的能量。
    ∑k=0N−1∣Xk∣2\sum_{k=0}^{N-1}|X_k|^2
  4. 比值 E(K)取值在 0 到 1 之间,越接近 1 说明能量越集中在前 K 个系数。
    E(K)→1E(K)\rightarrow 1

DCT与DFT比较——为什么不选傅里叶折叠法

小林也试过另一种整理流派:傅里叶折叠法。这种流派要求先把衣柜在镜子前照一下,把“镜像版本”和原衣柜首尾相连成一圈再折叠。问题是镜像操作引入了虚数,整个计算从实数变复数,运算量翻倍;折叠处还容易把两边不对称的衣物硬凑在一起,产生难看的折痕,也就是频谱泄漏。

DCT 则自带一面“软镜子”:它默认把序列做偶对称延拓后再折叠,延拓后的信号在边界处是平滑的,不需要复数参与,输出全部是实数。数学上,DFT 的基函数是复指数,DCT 的基函数是实余弦:

DCT 之所以成为 JPEG/MP3 的主力,是因为它三个优点集于一身:算得快(全实数)、边界服帖(偶延拓)、能量又集中。

X_k^{\mathrm{DFT}} = \sum_{n=0}^{N-1} x_n e^{-j2\pi kn/N}, \qquadX_k^{\mathrm{DCT}} = \sum_{n=0}^{N-1} x_n \cos\!\left[\frac{\pi}{N}\left(n+\frac12\right)k\right]
通俗理解:DFT 求的是“信号与某个旋转相量的相关性”,DCT 求的是“信号与某条余弦波的相关性”;余弦波是偶函数,天然契合“镜像折叠”。
  1. DFT 的核复指数可以展开为 cos + j sin,同时包含正弦与余弦两个分量,因此输出是复数。
    e−j2πkn/N=cos⁡(2πkn/N)−jsin⁡(2πkn/N)e^{-j2\pi kn/N}=\cos(2\pi kn/N)-j\sin(2\pi kn/N)
  2. DCT 的核只用余弦,等价于对信号做偶延拓后再取 DFT,虚部自动为零,计算量约为同长度复数 DFT 的一半。
    cos⁡[πN(n+12)k]\cos\left[\frac{\pi}{N}\left(n+\frac12\right)k\right]
  3. 频点排布差异DCT 的余弦相位是 \((n+\frac12)k\),使采样点落在余弦的极值附近,更好地抑制了边界跳变。
    πN(n+12)k\frac{\pi}{N}\left(n+\frac12\right)k

图像压缩流程——打包的标准四步

正式打包时,小林总结出四步流程:先给整柜衣服分区(分块),每格独立打分(DCT),打分后按“不常穿”标准粗略化处理(量化),最后把清单写成简洁编码(熵编码)。

具体到 JPEG:先把 RGB 颜色空间转换成 YCbCr——分离亮度与色度,因为人眼对色度分辨率低,可以先大幅压缩色度;然后把图像切成 8×8 的小块,每块做二维 DCT;最后对照亮度量化表 L 进行逐个系数量化。为什么是 8×8?因为自然图像的小块内通常很平坦,小块越小能量越集中,但分块过多会浪费比特记录边界,8×8 是经过大量实验得到的平衡点。

二维 DCT 系数的量化公式:

其中 Q(u,v) 是 JPEG 标准量化表中的对应步长,左上角小、右下角大。

解码时只需反量化——乘以量化表——再做逆 DCT 即可重建图像。量化表就是“打包时摈弃多少花哨款”的旋钮:拧得越狠,箱子越轻,花纹也越模糊。

F^(u,v)=round(F(u,v)Q(u,v))\hat{F}(u,v)=\mathrm{round}\left(\frac{F(u,v)}{Q(u,v)}\right)
通俗理解:对每个“风格分数”除以一个容忍度再取整。容忍度大的高频项经常被取整成 0,这正是压缩率的主要来源。
  1. 二维变换系数 F(u,v)8×8 分块做完二维 DCT 后的系数,u、v 分别代表水平/垂直频率。
    F(u,v)=∑x=07∑y=07f(x,y)cos⁡ ⁣[π8(x+12)u]cos⁡ ⁣[π8(y+12)v]F(u,v)=\sum_{x=0}^{7}\sum_{y=0}^{7} f(x,y)\cos\!\left[\frac{\pi}{8}\left(x+\frac12\right)u\right]\cos\!\left[\frac{\pi}{8}\left(y+\frac12\right)v\right]
  2. 量化步长 Q(u,v)每个频点独立的容忍度,低频小(精细)、高频大(粗糙),模仿人眼对高频不敏感的特性。
    Q(u,v)=quantization table valueQ(u,v)=\mathrm{quantization\ table\ value}
  3. 取整 round把连续系数变成整数,高频小系数大部分归零,这是有损压缩的关键一步。
    round(⋅)\mathrm{round}(\cdot)
  4. 量化后系数整数系数,0 越多压缩率越高,但信息缺失也越多。
    F^(u,v)\hat{F}(u,v)

JPEG编码流程——把清单写得更聪明

量化之后的系数矩阵里,左上角一个直流系数(百搭款)通常很大,其余 63 个交流系数(花哨款)大量是 0。小林写字很聪明:她先记下这一格与上一格百搭款的差值(差分编码),因为相邻两格的百搭款往往差不多,差值很小,写起来省字。

对交流系数,她不按逐行记,而是走“之字形”路线:从左上角出发、沿对角线往返扫过 8×8 方块。这样走完全程,非零值密集的左上角最先被记录,后面跟着一大串连续的 0,只需记“7 个 0 之后有个 2”这类短口令,也就是游程编码。

之字形扫描顺序可以用坐标序列表示:

最后把(跳过值,非零值)对做哈夫曼编码——出现频率最高的符号用最短的码字,整个 JPEG 码流就此诞生。一个 8×8 块往往只需要几十个比特就能描述。

S0=(0,0), S1=(0,1), S2=(1,0), S3=(2,0), S4=(1,1), S5=(0,2),…,S63=(7,7)S_0=(0,0),\,S_1=(0,1),\,S_2=(1,0),\,S_3=(2,0),\,S_4=(1,1),\,S_5=(0,2),\ldots,S_{63}=(7,7)
通俗理解:把二维系数按“先低频后高频”的顺序排成一个一维序列,让零值尽量连成串,方便后续用游程编码和哈夫曼编码压缩。
  1. 起始坐标直流系数位于 (0,0),它是整个块的亮度平均值,单独做差分编码。
    S0=(0,0)S_0=(0,0)
  2. 对角往返扫描方向在“右下-左上”间交替,使相邻频率的系数在序列中靠在一起。
    (0,1)→(1,0)(0,1)\to(1,0)
  3. 一维序列64 个系数按扫描顺序排列成 \(y_0,y_1,\ldots,y_{63}\),后续编码只用处理这个一维数组。
    ym=F(Sm),m=0,…,63y_m = F(S_m),\quad m=0,\ldots,63

压缩质量分析——取舍的艺术

舍弃得越多,箱子越轻,但当小林把量化步长调得过大时,她发现:每件衣服都变成了“基础款”,花纹细节全部消失,更糟的是格子与格子之间出现了明显的接缝——这就是图像压缩里著名的“块效应”。

做压缩算法的人需要一把量化“还原度”的尺子,最常用的是 PSNR(峰值信噪比),它比较原始图像与重建图像的逐像素误差。假设图像大小为 M×N:

实际工程里,JPEG 质量因子从 0 到 100,调得越低,量化表整体放大,文件越小,PSNR 越低,块效应越明显。打包的哲学从来不是“装得越少越好”,而是在“能装下”和“打开后还能认出衣服”之间找到平衡。

PSNR=10log⁡1025521MN∑m=0M−1∑n=0N−1[I(m,n)−I^(m,n)]2\mathrm{PSNR}=10\log_{10} \frac{255^2}{\frac{1}{MN}\sum_{m=0}^{M-1}\sum_{n=0}^{N-1}\left[I(m,n)-\hat I(m,n)\right]^2}
通俗理解:分子是信号最大“音量”的平方,分母是平均“失真噪声”的大小。比值越大(超过 30dB 通常算不错),说明重建越接近原图。
  1. 峰值信号255 是 8bit 图像的灰度最大值,平方后作为参考信号功率。
    2552255^2
  2. 均方误差 MSE原始图像与重建图像每个像素差值的平方取平均,失真越大数值越大。
    1MN∑m=0M−1∑n=0N−1[I(m,n)−I^(m,n)]2\frac{1}{MN}\sum_{m=0}^{M-1}\sum_{n=0}^{N-1}\left[I(m,n)-\hat I(m,n)\right]^2
  3. 取对数把量级差异巨大的比值压缩到方便阅读的分贝标度。
    10log⁡10(⋅)10\log_{10}(\cdot)

AI 应用场景

大规模图像数据集的存储与读取

阶段:数据准备与预处理

解决的问题:训练 CV 模型动辄需要几十 TB 的图片,直接存原始 BMP 既浪费磁盘又拖慢 IO。传统做法是手动压缩归档,但质量与体积难以兼顾。用 DCT 压缩后的 JPEG 格式作为统一存储格式,可以在保持肉眼不可察觉失真的前提下,把体积压缩到原来的 1/10 甚至更低,显著降低存储与传输成本。

具体案例:某自动驾驶公司每天从路测车辆采集 200 万张图像,数据管线将每张 12MB 的 RAW 图转为质量因子 90 的 JPEG(约 1.2MB),训练集吞吐量提升 8 倍;同时保留原始 RAW 用于难例挖掘,JPEG 用于常规训练,完整还原了 DCT 压缩“低频保整体、高频舍细节”的取舍逻辑。

实时视频编码与移动端图像传输

阶段:模型部署与推理优化

解决的问题:手机端实时视频通话需要每一帧在几十毫秒内完成编解码,纯 DFT 变换涉及复数运算,在低端芯片上延迟偏高。DCT 全实数变换配合快速算法,可以在嵌入式平台上轻松跑满 30fps;量化步长的动态调节还能应对网络带宽波动。

具体案例:某视频会议 App 在弱网环境下自动降低质量因子,从 35 提升到 80 不等;测试数据显示,在 300kbps 带宽下,采用 DCT 的 H.264 编码比早期 DFT 方案画面延迟低约 40ms,卡顿率下降了 60%。

音频特征提取与音乐识别

阶段:特征工程

解决的问题:MP3/AAC 编码器把音频帧变换到频域后,用心理声学模型决定每个频段的量化精度,这依赖 DCT 家族(MDCT)的高效实现。音乐识别 App 也常用 DCT 系数作为指纹特征:只保留前十几个系数,就能稳定匹配同一首歌的不同录音版本。

具体案例:某音乐 App 的哼唱识别模块,将 4 秒音频切成 50ms 的帧,每帧做 MDCT 后取低频系数组成 12 维特征向量,送入匹配模型;由于 DCT 能量集中的特性,特征维度小、抗噪性强,识别准确率从 76% 提升到 91%。

Python 演示

python75 行
import numpy as np N = 8 def dct2(block):    C = np.zeros((N, N))    for u in range(N):        for n in range(N):            C[u, n] = np.sqrt(2.0 / N) * np.cos(np.pi * (2 * n + 1) * u / (2 * N))    C[0] /= np.sqrt(2)    return C @ block @ C.T def idct2(coef):    C = np.zeros((N, N))    for u in range(N):        for n in range(N):            C[u, n] = np.sqrt(2.0 / N) * np.cos(np.pi * (2 * n + 1) * u / (2 * N))    C[0] /= np.sqrt(2)    return C.T @ coef @ C def zigzag_indices():    idx = []    i = j = 0    for _ in range(N * N):        idx.append((i, j))        if (i + j) % 2 == 0:            if j == N - 1:                i += 1            elif i == 0:                j += 1            else:                i, j = i - 1, j + 1        else:            if i == N - 1:                j += 1            elif j == 0:                i += 1            else:                i, j = i + 1, j - 1    return idx def psnr(orig, rec):    mse = np.mean((orig - rec) ** 2)    return 10 * np.log10(255.0 ** 2 / mse) if mse > 0 else float("inf") Q = np.array([    [16, 11, 10, 16, 24, 40, 51, 61],    [12, 12, 14, 19, 26, 58, 60, 55],    [14, 13, 16, 24, 40, 57, 69, 56],    [14, 17, 22, 29, 51, 87, 80, 62],    [18, 22, 37, 56, 68, 109, 103, 77],    [24, 35, 55, 64, 81, 104, 113, 92],    [49, 64, 78, 87, 103, 121, 120, 101],    [72, 92, 95, 98, 112, 100, 103, 99],]) xx, yy = np.meshgrid(np.arange(N), np.arange(N))block = 128 + 100 * np.cos(0.7 * np.sqrt((xx - 3.5) ** 2 + (yy - 3.5) ** 2)) coef = dct2(block)order = zigzag_indices()for keep in (1, 5, 10, 20, 64):    mask = np.zeros((N, N), dtype=bool)    for u, v in order[:keep]:        mask[v, u] = True    approx = idct2(coef * mask)    print(f"keep={keep:2d}  PSNR={psnr(block, approx):6.2f} dB") for quality in (10, 50, 90):    scale = max(1, 100 - quality) / 50.0    q = np.maximum(1, np.round(Q * scale))    qc = np.round(dct2(block) / q)    zeros = int((qc == 0).sum())    rec = idct2(qc * q)    print(f"quality={quality:2d}  零系数占比={zeros/64:2.0%}  PSNR={psnr(block, rec):6.2f} dB")
目的:完整演示“DCT 变换 → 系数取舍/量化 → 逆变换重建”的压缩链路,并输出 PSNR 指标。
  1. C[u, n] = np.sqrt(2.0 / N) * np.cos(np.pi * (2 * n + 1) * u / (2 * N))— 构造正交归一化的余弦基矩阵,这是 DCT-II 的核心。
  2. return C @ block @ C.T— 矩阵乘法一次完成二维 DCT:先对行变换,再对列变换。
  3. return C.T @ coef @ C— C 是正交矩阵,转置即逆变换,用于重建图像块。
  4. idx.append((i, j))— 记录之字形扫描的坐标对,模拟 JPEG 中把二维系数变一维的过程。
  5. approx = idct2(coef * mask)— 用布尔掩码只保留前 K 个系数,其余置零,观察能量集中带来的重建效果。
  6. qc = np.round(dct2(block) / q)— 量化:系数除以步长取整,这是有损压缩的关键步骤。
  7. psnr = 10 * np.log10(255.0 ** 2 / mse) if mse > 0 else float("inf")— 按峰值信噪比定义计算重建质量。

常见误区

误区DCT 的公式里只有余弦、没有虚数,DFT 却有 e^{jθ},二者看起来完全不同,应该是两个独立发明的算法。

正解DCT 本质上是对信号先做“偶延拓”再做 DFT。信号经过偶对称延拓后,傅里叶变换的虚部自动抵消为零,剩下的就是余弦项。好比同一件衣服,DFT 是照了哈哈镜后看到的扭曲版本,DCT 是照了普通平面镜后的正面版本,二者共享同一条“镜像折叠”底层逻辑。

为何常见:教科书通常先推导 DFT 再直接给出 DCT 公式,中间跳过了“偶延拓⟹虚部为零”的推导,学习者容易被公式表象误导,误以为是两套完全独立的理论。

误区把 DCT 系数除以一个大数再取整,只是让数字变小、便于编码,应该不会损失多少信息。

正解量化是 JPEG 唯一的有损环节。步长一大,大量高频系数被取整成 0,重建图像时这些频率成分永久丢失,表现为细节模糊和块效应。步长调小,文件变大但画质更接近原图。压缩率和画质是一座跷跷板的两端,量化步长就是中间的支点。

为何常见:初学者看到“取整”这个动作,直觉上以为只是四舍五入的小误差,没意识到高频系数的数量庞大,累积起来足以让整幅图像产生可见失真。

误区PSNR 是客观指标,数值高就代表画质好,所以调参时只要盯着 PSNR 最大化就行。

正解PSNR 只计算逐像素均方误差,无法反映人眼的纹理敏感度、边缘感知等高级视觉特性。同一 PSNR 下,均匀模糊可能比局部块效应更“好看”,因为人眼对规则重复的块状伪影极其敏感。这也是为什么现代编码器还要引入 SSIM、VMAF 等感知指标。

为何常见:PSNR 公式简洁、单位是 dB,给人一种“科学客观”的信赖感;而人眼的主观评价难以量化,初学者容易把数学指标当成万能标尺。

误区DCT 只是把像素值换了一组坐标表示,正交变换可逆,因此压缩过程不丢信息。

正解DCT 本身确实无失真——系数保留足够精度时,逆变换能完美还原原图。但 JPEG 压缩链路的下一步是量化,量化把小数系数变成有限精度的整数,这一步不可逆。好比你把衣柜的每个分数精确记下来可以还原,但为了省纸把分数四舍五入后,就再也回不到精确值了。

为何常见:“正交变换可逆”这个正确结论容易让人产生“全程无损”的错误联想,忽略了变换之后还有量化这个信息瓶颈。

面试题

Q1. DCT-II 变换后 k=0 的系数代表什么?

单选题 · easy

  • A.整段信号的平均能量
  • B.最高频率成分的强度
  • C.直流分量即平均亮度← 正确答案
  • D.相邻像素的边缘差值

答案:C。k=0 时余弦项恒为 1,公式退化为对所有 x_n 求和再归一化,得到的就是直流分量,可以理解为衣柜的“整体素净度”。B 错,最高频对应 k=N-1;D 错,DCT 不是差分运算。

Q2. JPEG 中把图像切成 8×8 小块的主要原因是什么?

单选题 · easy

  • A.减少存储空间占用
  • B.小块内更平坦能量集中← 正确答案
  • C.方便人眼看清每个块
  • D.降低图像的色彩深度

答案:B。自然图像在大范围内变化复杂,但 8×8 小区域内部通常很平坦,DCT 后能量更集中,更容易被压缩。A 是结果而非原因;C、D 与分块无直接关系。

Q3. DCT 相比 DFT 的主要工程优势是什么?

单选题 · mid

  • A.可以无损地压缩任意信号
  • B.输出全是实数计算量更小← 正确答案
  • C.不需要任何三角函数的计算
  • D.支持任意尺寸的图像分块

答案:B。DCT 等价于偶延拓后的 DFT,虚部自动消失,输出为实数,运算量约为同长度复 DFT 的一半。A 错,量化仍会带来损失;C 错,DCT 本身就用余弦函数;D 错,DCT 对任意 N 都适用,这不是它相对 DFT 的优势。

Q4. 除直流系数外,之字形扫描最先记录的是哪个系数?

单选题 · mid

  • A.(1, 0) 水平频率分量
  • B.(0, 1) 垂直频率分量← 正确答案
  • C.(7, 7) 最高频分量
  • D.(0, 0) 直流分量

答案:B。之字形扫描从 (0,0) 出发,下一步是 (0,1),然后 (1,0)、(2,0)、(1,1)……按“先低频后高频”排列。A 是第二步的场景;C 顺序最后;D 是直流分量本身,不在此列。

Q5. JPEG 压缩流程中包含下列哪些步骤?

多选题 · mid

  • A.RGB 到 YCbCr 的颜色转换← 正确答案
  • B.8×8 分块与二维 DCT← 正确答案
  • C.量化表的逐系数量化← 正确答案
  • D.哈夫曼熵编码压缩码流← 正确答案

答案:ABCD。JPEG 的完整流水线就是“颜色转换→分块 DCT→量化→熵编码”四步,缺一不可。四个选项分别对应打包流程中的分组、打分、取舍和记账环节。

Q6. 关于 PSNR 的说法正确的是?

单选题 · easy

  • A.单位为 dB,值越大失真越小← 正确答案
  • B.单位为 dB,值越大文件越大
  • C.单位为 Hz,值越大频率越高
  • D.单位为 bit,值越大存储越小

答案:A。PSNR 是峰值信号与均方误差之比的对数,单位 dB。信号一定时,误差越小比值越大,因此 PSNR 越高代表重建越接近原图。B 混淆了文件大小,C、D 的单位都不正确。

Q7. 典型自然图像的 8×8 块,只保留前 10% 的 DCT 系数,能量保留率通常能达到多少?

单选题 · mid

  • A.约 10%,与保留比例一致
  • B.约 30%,多数能量分散
  • C.约 50%,低频与高频均分
  • D.约 90% 以上,能量高度集中← 正确答案

答案:D。DCT 最重要的特性就是能量集中,8×8 块中前 6 个左右系数(约 10%)往往携带 90% 以上的能量。这就是“少数百搭款撑起整个气场”的量化版本。A、B、C 都低估了低频的支配地位。

Q8. 下列哪种现象是 JPEG 量化步长设置过大直接导致的?

单选题 · hard

  • A.图像整体偏色失真
  • B.8×8 边界清晰可见← 正确答案
  • C.图像分辨率下降
  • D.色彩空间发生错误

答案:B。量化过重使每个 8×8 块内的高频细节全部丢失,块与块之间在边界处的像素跳变变得明显,形成格子状伪影,即块效应。A 偏色通常来自颜色空间转换错误;C 分辨率是输出尺寸问题;D 与量化无关。

Q9. 下列哪些方法可以有效缓解 JPEG 压缩产生的块效应?

多选题 · hard

  • A.适当减小量化步长← 正确答案
  • B.采用更大的 DCT 分块← 正确答案
  • C.解码后应用去块滤波← 正确答案
  • D.改用 DFT 替代 DCT

答案:ABC。小量化步长能保留更多高频细节;更大分块让相邻块差异更小;去块滤波是解码端常规手段。D 错,DFT 的边界泄漏问题更严重,且虚数运算效率更低,不能解决块效应。

Q10. 下列哪些领域应用了 DCT 或 MDCT 技术?

多选题 · mid

  • A.JPEG 图像压缩编码← 正确答案
  • B.MP3 音频频谱处理← 正确答案
  • C.视频编码帧内残差变换← 正确答案
  • D.数据库索引排序

答案:ABC。JPEG 用 DCT,MP3/AAC 用 MDCT(DCT 家族成员),视频编码 H.264/H.265 也用整数 DCT 处理帧内残差。数据库排序属于结构化数据处理,与信号频域变换无关。