图像压缩:变换域与小波域技术解析
1. 变换域图像压缩问题探讨
在变换域图像压缩中,存在诸多需要解决的问题,这些问题对于理解和优化图像压缩技术至关重要。
1.1 变换相关证明与计算
- 特定变换的系数方差几何均值 :对于变换 (A = \begin{bmatrix} \alpha & \sqrt{1 - \alpha^2} \ \sqrt{1 - \alpha^2} & -\alpha \end{bmatrix}) 且 (\sigma_x^2 = 1),需要证明在相邻样本相关系数为 (\rho) 时,系数方差的几何均值等于 (\sqrt{1 - 4\alpha^2\rho^2(1 - \alpha^2)})。当 (\alpha = \frac{1}{\sqrt{2}}) 时,还需计算该几何均值,并证明编码增益 (G_{TC} = \frac{1}{\sqrt{1 - \rho^2}})。
- Haar 变换的系数方差与相关性 :对于 Haar 变换 (A = \frac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1 \ 1 & -1 \end{bmatrix}),输入方差为 (\sigma_x^2) 且相关系数 (\rho = 0.9),要证明变换系数的方差为 (\sigma_0^2 = 1.9\sigma_x^2) 和 (\sigma_1^2 = 0.1\sigma_x^2),同时证明这两个变换系数不相关。
- 一维和二维变换的系数均值比 :考虑相邻像素相关系数在两个维度相同的图像,在一维变换 (X = Ax)((A) 为上述 Haar 变换矩阵)时,证明系数方差的算术均值与几何均值之比等于 (\frac{1}{\sqrt{1 - \rho^2}});在二维变换 (X = AxA^T) 且自相关函数可分离时,证明变换系数的算术均值与几何均值之比为 (\frac{1}{1 - \rho^2})。还需计算当 (\rho = 0.95) 时该比值,并分析自相关函数各向同性时的编码增益损失。
1.2 图像压缩的实际问题
- 最优比特分配 :对于 (2×2) 图像和上述变换,在平均比特率为 (2) bpp 的情况下,假设量化器性能因子为 (1),(\sigma_x^2 = 1) 且 (\rho = 0.95),需要找到最优比特分配。
- 不同变换的最优比特分配比较 :对于所选的强度图像,获取 (8×8) KLT 并找到 (1) bpp 比特预算下的最优比特分配,同时与 (8×8) 的正弦变换和 DCT 进行比较,可使用 MATLAB 工具解决该问题。
- 整数比特分配规则应用 :重复上述获取最优比特的过程,但使用整数比特分配规则。
- DCT 编码器的 MATLAB 实现 :开发 MATLAB 代码,使用 JPEG 规则和表格将压缩比特写入指定文件,并验证写入文件的压缩比特流的正确性,通过读取压缩文件、解码并显示图像来完成验证。
- 图像分解与量化分析 :使用不同的度量(如块方差)将强度图像分解为可变大小的方形块,对可变大小的 DCT 系数进行量化和反量化,计算重建图像的 SNR。增加量化级别,观察块效应或其他伪像的出现,并对观察到的现象进行评论。
- Hadamard 变换的块效应讨论 :讨论基于 Hadamard 变换的量化器在真实强度图像上引起的块效应,使用 (8×8) 像素的变换大小。
- RGB 图像的量化与块效应分析 :使用 JPEG 规则和表格对 RGB 图像进行 (4:2:0) 和 (4:2:2) 采样格式的量化和反量化,解释块效应的性质,比较与相应强度图像的差异,分析颜色是否会改变感知,使用量化器比例为 (2)。
2. 小波域图像压缩概述
图像数据压缩可通过去除像素间的相关性(如预测编码)或在少量系数中压缩像素能量(如变换编码)来实现。小波域压缩同样基于在少量系数中压缩像素能量的原理,与变换编码的主要区别在于小波变换通常应用于整个图像,而变换编码通常应用于子块。这里提到的小波域或小波变换指的是离散小波变换(DWT)。
2.1 二维 DWT 原理
在二维 DWT 中,图像被转换为四组不同的系数,一组是图像在较低分辨率下的近似,另外三组是水平、垂直和对角方向的细节信息,这被称为一级小波变换。在倍频带分解中,第一级的近似系数会再次分解为四组系数,以获得二级二维 DWT,此过程可进一步迭代。而在全树 DWT 中,每一级的每个子带都会分裂为四个子带,以获得更高一级的 DWT。
2.2 DWT 编码器设计要素
设计 DWT 图像编码器涉及以下几个方面:
1.
选择合适的二维离散小波
:需要考虑线性相位、正交性、滤波器长度和正则性等因素。
2.
确定分解的级数
:级数的选择具有灵活性,取决于应用场景,但要平衡质量和比特率。
3.
最优比特分配
:根据比特预算为所有系数分配量化器比特。
4.
量化器设计
:选择合适的量化器对 DWT 系数进行量化。
5.
熵编码器设计
:将系数转换为二进制代码,用于传输或存储。
3. DWT 编码器设计详细分析
3.1 小波的选择
选择小波实际上是选择合适的滤波器组,数字滤波器在选择小波时需要考虑以下约束:
-
线性相位
:图像中非线性相位引起的失真很烦人,尤其是在边缘周围。非线性相位的滤波器(如九阶切比雪夫低通 IIR 滤波器)会导致图像边缘严重失真,而线性相位 FIR 滤波器则不会出现相位失真。虽然在四带子带编码系统中,无法实现同时具有线性相位和正交性的 FIR 滤波器,但可以使用满足线性相位和正交性的 IIR 滤波器来实现正交小波变换。总体而言,线性相位 FIR 滤波器优于非线性相位响应的滤波器。以下是展示相位失真的 MATLAB 代码:
% ShowPhaseDistortion.m
% Illustration of the effect of non-linear
% phase on the filtered image
% IIR filter with non-linear phase and
% FIR filter with linear phase are considered.
% IIR filter is 9th order and FIR filter has 9 taps.
clear
% design IIR Chebychev filter of order N, stopband
% ripple A dB down, and stopband edge frequency Ef
% Ef should be 0 < Ef < 1
A = 30;
N = 9;
Ef = 0.5;
[b,a] = cheby2(N,A,Ef);
[H,W] = freqz(b,a,256);
subplot(2,2,1),plot(W,abs(H),'k','LineWidth',2)
title('IIR Magnitude response')
subplot(2,2,2),plot(W,angle(H),'k','LineWidth',2)
title('IIR Phase response')
%
% design a lowpass FIR filter with N taps (N-1-st order)
% with passband edge at Ef
b1 = fir1(N-1,Ef);
a1 = zeros(size(b1));
a1(1) = 1;
[H1,W1] = freqz(b1,a1,256);
subplot(2,2,3),plot(W1,abs(H1),'k','LineWidth',2)
title('FIR Magnitude response')
subplot(2,2,4),plot(W,angle(H1),'k','LineWidth',2)
title('FIR Phase response')
%
% read an image and filter it through IIR & FIR filters
f = imread('cameraman.tif');
%f = imread('birds.ras');
[Height,Width,Depth] = size(f);
if Depth == 3
f1 = rgb2ycbcr(f);
f = f1(:,:,1);
clear f1
end
% filter row by row first
g = zeros(Height,Width);
y = zeros(Height,Width);
for m = 1:Height
g(m,:) = filter(b,a,double(f(m,:)));
end
% next filter along columns
for m = 1:Width
y(:,m) = filter(b,a,double(g(:,m)));
end
% Next, filter the original input image through linear
% phase FIR
% filter
% The function "filter2" does the 2D filtering
g1 = filter2(b1,f,'same');
% Display the images
figure,imshow(uint8(round(y))),title('Filter with nonlinear phase')
figure, imshow(uint8(round(g1))), title('Filter with linear phase')
-
正交性
:正交变换的一个重要特性是能量守恒,这意味着 DWT 系数量化的总失真等于每个子带失真之和,允许对各个子带进行不同级别的量化,以实现高压缩和良好的视觉质量。图 8.2 展示了使用 Haar、Daubechies 2(db2)、coiflet 4(coif4)和 sym8 小波对游艇图像进行三级二维 DWT 的结果,coiflet 小波在近似系数中压缩能量最多,Haar 最少。表 8.1 列出了子带中实际包含的能量百分比。
| 波段 | Haar | Db2 | Coif4 | Sym8 | Bior1.5 |
| — | — | — | — | — | — |
| LL3 | 99.19 | 99.35 | 99.54 | 99.48 | 99.12 |
| HL3 | 0.084 | 0.055 | 0.029 | 0.033 | 0.036 |
| LH3 | 0.076 | 0.044 | 0.024 | 0.027 | 0.030 |
| HH3 | 0.017 | 0.012 | 0.006 | 0.007 | 0.004 |
| HL2 | 0.128 | 0.117 | 0.080 | 0.092 | 0.145 |
| LH2 | 0.125 | 0.090 | 0.065 | 0.075 | 0.113 |
| HH2 | 0.040 | 0.037 | 0.028 | 0.031 | 0.041 |
| HL1 | 0.129 | 0.106 | 0.089 | 0.103 | 0.213 |
| LH1 | 0.165 | 0.133 | 0.096 | 0.107 | 0.177 |
| HH1 | 0.051 | 0.055 | 0.041 | 0.046 | 0.118 | - 滤波器长度 :高阶滤波器具有更好的带外抑制特性,但长长度的滤波器会在边缘周围产生振铃效应,且计算量更大。因此,在小波域图像压缩中,更倾向于使用较短的滤波器。
- 正则性 :如果滤波器的迭代趋向于连续函数,则称该滤波器为正则滤波器。从压缩的角度来看,正则正交滤波器组更受青睐,因为在使用多级 DWT 分解时,它引入的伪像更少。
综上所述,在小波域图像压缩中,更倾向于使用较短、平滑的线性相位滤波器,且具有适度的正则性。
3.2 DWT 级数的选择
DWT 级数的使用在编码方案中具有灵活性,取决于应用场景。但需要注意的是,由于 DWT 的迭代,在低比特率下量化失真可能会变得明显。当然,计算负载会随着级数的增加而增加,但并非成比例增加,因为子带大小会随着级数的增加而减小。因此,需要在质量和比特率之间找到平衡,以确定合适的 DWT 级数。
3.3 最优比特分配
如果使用的小波是正交的,则能量守恒,子带是正交的,可以使用与离散余弦变换(DCT)编码相同的方法为量化器分配比特。对于具有 (R) bpp 比特预算的图像的 (L) 级二维 DWT,第 (i) 个子带的量化器比特数可以通过以下公式获得:
[R_i = R + \frac{1}{2} \log_2 \left( \frac{\sigma_i^2}{\left( \sum_{k = 1}^{3L + 1} \sigma_k^2 \right)^{\frac{1}{3L + 1}}} \right), \quad 1 \leq i \leq 3L + 1]
需要注意的是,(L) 级二维 DWT 的图像有 (3L + 1) 个子带。单个量化器比特可能为负数或非整数,可以使用与变换编码器相同的整数比特分配规则来计算具有整数比特数的最优比特分配。在使用整数比特分配时,必须首先计算所有子带的 DWT 系数的方差,然后应用整数比特分配规则。
3.4 DWT 系数的量化
确定量化器的最优比特数后,需要对各种 DWT 系数进行量化。可以使用 Lloyd - Max(非均匀)量化器或均匀量化器对 DWT 系数进行量化。
-
近似系数的量化
:最低频带 LL(最高级别)的 DWT 系数是原始图像在较低分辨率下的近似,其特性与原始图像相似。为了实现更高的压缩,可以单独使用 Lloyd - Max 量化器或均匀量化器对最低频带系数进行量化,也可以使用 DCT 和 DPCM 或仅使用 DPCM 进行量化。
-
细节系数的量化
:
-
Lloyd - Max 量化器
:图像二维 DWT 的所有级别的细节系数具有广义零均值高斯分布,且衰减较快。其概率密度函数为:
[p(x) = \frac{\beta}{2\alpha\Gamma \left( \frac{1}{\beta} \right)} e^{-\left( \frac{|x - \mu|}{\alpha} \right)^{\beta}}]
其中,伽马函数 (\Gamma(z)) 定义为:
[\Gamma(z) = \int_{0}^{\infty} t^{z - 1} e^{-t} dt]
对于正整数 (n),(\Gamma(n) = (n - 1)!)。当 (\beta = 1) 时,对应于拉普拉斯分布;当 (\beta = 2) 时,得到正态分布。可以根据细节系数的概率密度函数设计 Lloyd - Max 量化器。
-
均匀量化器
:由于熵编码紧随量化之后,均匀量化器几乎是最优的,并且易于实现。因此,可以使用均匀量化器对所有 DWT 系数(包括近似系数)进行量化。已经证明,在原点周围具有两倍量化步长的死区的均匀量化器从压缩的角度来看是高效的,且不会损失质量,原因之一是死区可以过滤掉高频带中的噪声。
3.5 示例说明
以下是一个示例,说明如何在小波域进行图像压缩。使用最多三级的正交二维 DWT 和均匀量化器对 DWT 系数进行量化,使用最优比特分配规则(上述公式)计算均匀量化器的比特数,以满足 (1) bpp 的比特预算。假设小波为 Daubechies “db2”,其分析和合成滤波器长度为 (4),“db2” 小波是正交的,实现了酉变换。对于彩色图像,使用 (4:2:2) 采样格式。
% Example8_1.m
% Image compression in the wavelet domain
% An L-level 2D DWT of an input image is computed
% using "db8" orthogonal wavelet. Optimal quantizer
% bits are computed for a bit budget of R (typically 1) bpp
% and then the quantization steps are computed.
% Uniform quantization is used across all the bands.
% if the input image RGB, it is converted to YCbCr
% components, Cb and Cr components are down sampled to
% 4:2:0 or 4:2:2 format and quantized.
% User may specify the values for R, L, and sampling format.
% Parameters are:
%
% SamplingFormat = "4:2:0" or "4:2:2"
%
% L = number of levels of DWT
%
% R = bit budget in bpp
%
% BitAssignRule = "optimal" or "integer"
clear
A = imread('yacht.ras');
L = 3; % number of DWT levels
% make sure that the image size is divisible by NL
[x,y,z] = size(A);
if mod(x,2^L) ~= 0
Height = floor(x/(2^L))*(2^L);
else
Height = x;
end
if mod(y,2^L) ~= 0
Width = floor(y/(2^L))*(2^L);
else
Width = y;
end
Depth = z;
clear x y z
%
SamplingFormat = '4:2:2'; % for RGB image
wName = 'db2'; % wavelet name. See MATLAB for available wavelets
%wName = 'coif2';
% bit budget: R1 for Y, R2 for Cb & R3 for Cr
R1 = 1.0; R2 = 0.5; R3 = 0.5;
BitAssignRule = 'optimal';
if Depth == 1
% input image is B/W
Y = double(A(1:Height,1:Width)) - 128;
else
% Input image is RGB. Convert it to YCbCr
% using JPEG2000 reversible component transformation
A1 = double(A(1:Height,1:Width,1:Depth)) - 128;
Y = 0.299*A1(:,:,1) + 0.587*A1(:,:,2) + 0.144*A1(:,:,3);
Cb = -0.16875*A1(:,:,1) - 0.33126*A1(:,:,2) + 0.5*A1(:,:,3);
Cr = 0.5*A1(:,:,1) - 0.41869*A1(:,:,2) - 0.08131*A1(:,:,3);
switch SamplingFormat
% subsample chroma components
case '4:2:0'
Cb = imresize(Cb,[Height/2 Width/2],'cubic');
Cr = imresize(Cr,[Height/2 Width/2],'cubic');
case '4:2:2'
Cb = imresize(Cb,[Height Width/2],'cubic');
Cr = imresize(Cr,[Height Width/2],'cubic');
end
end
%
[C,S] = wavedec2(Y,L,wName); % L-level 2D DWT of the Luma
% Compute optimal quantizer bits
switch BitAssignRule
case 'optimal'
[Qbits,Qsteps] = DWToptimalBits(C,S,wName,R1);
case 'integer'
[Qbits,Qsteps] = AssignIntgrBits2DWT(C,S,wName,R1);
end
% find total bits for the Y component
TotalBitsY = (S(L + 1,1)*S(L + 1,2))*sum(Qbits(1:3)) +...
(S(L,1)*S(L,2))*sum(Qbits(4:6)) + (S(L - 1,1)*S(L - 1,2))*sum(Qbits(7:10));
sprintf('Number of levels of DWT = %d\nquantizer %s bits\n',L, BitAssignRule)
disp(Qbits(1:3*L + 1)')
%
% Quantize and dequantize the coefficients
% Function "quantizeDWT" quantizes and dequantizes the DWT
% coefficients
Cq = quantizeDWT(C,S,Qsteps);
Yq = waverec2(Cq,S,wName); % do inverse 2D DWT of quantized Y coefficients
SNR = 20*log10(std2(Y)/std2(Y - Yq));
% Calculate SNR of Y component
sprintf('SNR(Y) = %4.2fdB\n',SNR)
if Depth == 1
figure,imshow(Yq + 128,[])
AvgBit = TotalBitsY/(Height*Width);
sprintf('Desired avg. rate = %3.2f bpp\tActual avg. rate = %3.2f bpp\n',R1,AvgBit)
end
% If the input image is RGB, quantize the Cb & Cr components
if Depth > 1
[C,S] = wavedec2(Cb,L,wName); % L-level 2D DWT of Cb
switch BitAssignRule
case 'optimal'
[Qbits,Qsteps] = DWToptimalBits(C,S,wName,R2);
case 'integer'
[Qbits,Qsteps] = AssignIntgrBits2DWT(C,S,wName,R2);
end
% find total bits for the Cb component
TotalBitsCb = (S(L + 1,1)*S(L + 1,2))*sum(Qbits(1:3)) +...
(S(L,1)*S(L,2))*sum(Qbits(4:6)) + (S(L - 1,1)*S(L - 1,2))*sum(Qbits(7:10));
sprintf('Cb quantizer bits: ')
disp(Qbits(1:3*L + 1)')
Cq = quantizeDWT(C,S,Qsteps); % quantize Cb DWT coefficients
Cbq = waverec2(Cq,S,wName); % do 2D IDWT of quantized Cb
SNRcb = 20*log10(std2(Cb)/std2(Cb - Cbq));
%
[C,S] = wavedec2(Cr,L,wName); % L-level 2D DWT of Cr
switch BitAssignRule
case 'optimal'
[Qbits,Qsteps] = DWToptimalBits(C,S,wName,R3);
case 'integer'
[Qbits,Qsteps] = AssignIntgrBits2DWT(C,S,wName,R3);
end
% find total bits for the Cr component
TotalBitsCr = (S(L + 1,1)*S(L + 1,2))*sum(Qbits(1:3)) +...
(S(L,1)*S(L,2))*sum(Qbits(4:6)) + (S(L - 1,1)*S(L - 1,2))*sum(Qbits(7:10));
sprintf('\nCr quantizer bits: ')
disp(Qbits(1:3*L + 1)')
% Find the overall average bit rate in bpp.
AvgBit = (TotalBitsY + TotalBitsCb + TotalBitsCr)/(Height*Width);
sprintf('Actual avg. rate = %5.4f bpp\n',AvgBit)
Cq = quantizeDWT(C,S,Qsteps); % quantize Cr DWT coefficients
Crq = waverec2(Cq,S,wName); % do 2D IDWT of quantized Cr coefficients
SNRcr = 20*log10(std2(Cr)/std2(Cr - Crq));
% upsample Cb & Cr to full resolution
Cbq = imresize(Cbq,[Height Width],'cubic');
Crq = imresize(Crq,[Height Width],'cubic');
Ahat = zeros(Height,Width,Depth);
% Do inverse component transformation & add DC level
Ahat(:,:,1) = Yq + 1.402*Crq + 128;
Ahat(:,:,2) = Yq - 0.34413*Cbq - 0.71414*Crq + 128;
Ahat(:,:,3) = Yq + 1.772*Cbq + 128;
figure,imshow(uint8(round(Ahat)))
sprintf('Chroma sampling = %s\n',SamplingFormat)
sprintf('SNR(Cb) = %4.2fdB\tSNR(Cr) = %4.2fdB\n',SNRcb,SNRcr)
end
function [Qbits,Qsteps] = DWToptimalBits(C,S,wName,R)
% [Qbits,Qsteps] = DWToptimalBits(C,S,wName,R)
% Assign quantizer bits for the L-level 2D DWT
% coefficients using the optimal bit allocation rule.
% Quantizer bits are rounded to nearest integers and
% negative bits are assigned zero values.
L = size(S,1) - 2; % number of DWT levels
Coef = cell(3*L + 1,1); % cell array to store L-level DWT coefficients
% extract the detail and approximation DWT coefficients
j = 1;
for k = 1:L
[Coef{j},Coef{j + 1},Coef{j + 2}] = detcoef2('all',C,S,k);
j = j + 3;
end
Coef{3*L + 1} = appcoef2(C,S,wName,L);
% Compute and store the coefficient variances
CoefVar = zeros(3*L + 1,1);
for k = 1:L
k1 = (k - 1)*3;
for j = 1:3
CoefVar(k1 + j) = std2(Coef{k1 + j})*std2(Coef{k1 + j});
if CoefVar(k1 + j) == 0
CoefVar(k1 + j) = 1;
end
end
end
CoefVar(3*L + 1) = std2(Coef{3*L + 1})*std2(Coef{3*L + 1});
% Geometric mean of variances
gm = 1;
p = 1.0/(3*L + 1);
for j = 1:L
j1 = (j - 1)*3;
gm = gm * prod(CoefVar(j1 + 1:j1 + 3));
end
gm = (gm*CoefVar(3*L + 1))^p;
%
Qbits = zeros(3*L + 1,1);
% compute quantizer bits using coefficient variances and
% geometric mean of the variances
for k = 1:3*L + 1
Qbits(k) = round(R + 0.5*log2(CoefVar(k)/gm));
if Qbits(k) < 0
Qbits(k) = 0;
end
end
% Compute the quantization steps
% note that zero quantizer bit is not assigned infinity to Qstep
Qsteps = zeros(3*L + 1,1);
for k = 1:3*L + 1
maxCoef = max(max(Coef{k}));
D = maxCoef;
if D ~= 0
Qsteps(k) = D/(2*2^Qbits(k));
else
Qsteps(k) = 1.0e+16;
end
end
end
function [Qbits,Qsteps] = AssignIntgrBits2DWT(C,S,wName,R)
% Assigns DWT coefficient quantizer bits optimally using
% recursive integer bit allocation rule.
L = size(S,1) - 2;
Coef = cell(3*L + 1,1);
Rtotal = (3*L + 1)*R;
% total bits for the N x N block
j = 1;
for k = 1:L
[Coef{j},Coef{j + 1},Coef{j + 2}] = detcoef2('all',C,S,k);
j = j + 3;
end
Coef{3*L + 1} = appcoef2(C,S,wName,L);
CoefVar = zeros(3*L + 1,1);
for k = 1:L
k1 = (k - 1)*3;
for j = 1:3
CoefVar(k1 + j) = std2(Coef{k1 + j})*std2(Coef{k1 + j});
if CoefVar(k1 + j) == 0
CoefVar(k1 + j) = 1;
end
end
end
CoefVar(3*L + 1) = std2(Coef{3*L + 1})*std2(Coef{3*L + 1});
Qbits = zeros(3*L + 1,1);
%
while Rtotal > 0
Max = -9999;
for k = 1:3*L + 1
if Max < CoefVar(k)
Max = CoefVar(k);
Indx = k;
end
end
Qbits(Indx) = Qbits(Indx) + 1;
CoefVar(Indx) = CoefVar(Indx)/2;
Rtotal = Rtotal - 1;
end
Qsteps = zeros(3*L + 1,1);
for k = 1:3*L + 1
maxCoef = max(max(Coef{k}));
D = maxCoef;
if D ~= 0
Qsteps(k) = D/(2*2^Qbits(k));
else
Qsteps(k) = 1.0e+16;
end
end
end
function y = quantizeDWT(C,S,Qsteps)
% y = quantizeDWT(C,S,Qsteps)
% This function quantizes and dequantizes the DWT coefficients
% based on the given quantization steps.
% The implementation details are not shown here as it depends on
% the specific requirements and the MATLAB functions used.
% You may need to define the quantization and dequantization logic
% according to your needs.
end
3.6 结果分析
图 8.6 展示了在小波域压缩的 Masuda 图像的亮度分量,与基于 DCT 的压缩不同,在约 (0.6) bpp 时没有看到任何块效应,视觉质量良好。表 8.2 和表 8.3 分别列出了使用 “db2” 和 “coif2” 小波进行小波域量化/反量化的图像的 SNR。在视觉质量方面,“db2” 和 “coif2” 小波的性能大致相同,但 “coif2” 在 SNR 方面略优于 “db2”,尤其是对于色度分量。此外,发现进行电平偏移比不进行电平偏移能获得略高的 SNR。
| 图像 | bpp | Y (dB) | Cb (dB) | Cr (dB) |
|---|---|---|---|---|
| Aerial | 0.2800 | 11.23 | NA | NA |
| Airplane | 0.5335 | 21.91 | 17.78 | 14.65 |
| Autumn | 0.8082 | 23.00 | 11.80 | 10.09 |
| Birds | 0.5422 | 19.36 | 24.61 | 25.68 |
| Cameraman | 0.3100 | 16.71 | NA | NA |
| Hat woman | 0.5550 | 22.89 | 23.04 | 22.06 |
| Lighthouse | 0.5090 | 12.36 | 19.77 | 20.72 |
| Masuda | 0.5654 | 24.94 | 19.06 | 19.85 |
| Peppers | 0.5697 | 21.08 | 20.94 | 21.03 |
| Yacht | 0.6461 | 18.34 | 18.35 | 18.04 |
| 图像 | bpp | Y (dB) | Cb (dB) | Cr (dB) |
|---|---|---|---|---|
| Aerial | 0.3200 | 11.74 | NA | NA |
| Airplane | 0.6453 | 21.53 | 18.24 | 15.69 |
| Autumn | 0.9534 | 22.80 | 11.61 | 10.21 |
| Birds | 0.6740 | 18.76 | 27.64 | 26.42 |
| Cameraman | 0.4100 | 16.60 | NA | NA |
| Hat woman | 0.6295 | 23.05 | 23.19 | 22.14 |
| Lighthouse | 0.5974 | 12.51 | 20.84 | 21.92 |
| Masuda | 0.7018 | 25.20 | 19.28 | 21.28 |
| Peppers | 0.7118 | 21.91 | 22.05 | 20.89 |
| Yacht | 0.7781 | 18.48 | 18.83 | 18.52 |
3.7 流程图总结
下面是一个 mermaid 格式的流程图,总结了上述示例中的图像压缩流程:
graph TD;
A[读取图像] --> B{图像类型};
B -- 灰度图像 --> C[转换为双精度并电平偏移];
B -- RGB 图像 --> D[转换为 YCbCr 分量];
D --> E[色度分量下采样];
C --> F[计算二维 DWT];
E --> F;
F --> G[计算最优量化器比特];
G --> H[计算量化步长];
H --> I[量化和反量化系数];
I --> J[进行逆二维 DWT];
J --> K[计算 SNR];
K --> L{图像类型};
L -- 灰度图像 --> M[显示图像并输出比特率];
L -- RGB 图像 --> N[色度分量上采样];
N --> O[逆分量变换并加 DC 电平];
O --> P[显示图像并输出 SNR];
这个流程图展示了从读取图像到最终显示压缩后图像的整个过程,包括图像类型判断、颜色空间转换、DWT 计算、量化、反量化、逆变换以及 SNR 计算等关键步骤。通过这个流程图,可以更清晰地理解小波域图像压缩的整体流程和各个步骤之间的关系。
综上所述,小波域图像压缩是一种有效的图像压缩方法,通过合理选择小波、确定分解级数、进行最优比特分配和量化,可以在保证一定视觉质量的前提下实现较高的压缩比。同时,通过实际示例和代码的分析,我们可以更好地掌握如何在 MATLAB 中实现小波域图像压缩。希望本文对您理解和应用小波域图像压缩技术有所帮助。
4. 变换域与小波域图像压缩对比
4.1 原理对比
- 变换域 :变换域编码主要是将图像分块后进行离散余弦变换(DCT)等变换,把图像的能量集中到少数系数上,然后对这些系数进行量化和编码。例如在 JPEG 编码中,就是将图像分成 8×8 的小块进行 DCT 变换。
- 小波域 :小波域编码是对整个图像进行离散小波变换(DWT),将图像分解为不同尺度和方向的子带系数。通过对这些子带系数进行量化和编码,实现图像压缩。与变换域不同的是,小波变换可以更好地捕捉图像的局部特征。
4.2 性能对比
- 压缩比 :在相同的视觉质量下,小波域压缩通常可以获得更高的压缩比。因为小波变换能够更有效地将图像能量集中到少数系数上,尤其是对于细节丰富的图像。
- 视觉质量 :变换域压缩在低比特率下容易出现块效应,影响视觉质量。而小波域压缩在低比特率下的块效应相对较小,视觉质量更好。例如,在上述小波域压缩的 Masuda 图像示例中,在约 0.6 bpp 时没有看到明显的块效应。
- 计算复杂度 :变换域编码的计算复杂度相对较低,因为它主要是对分块的图像进行变换。而小波域编码需要对整个图像进行多级小波变换,计算复杂度较高。
4.3 应用场景对比
- 变换域 :适用于对计算资源要求较低、对压缩比要求不是特别高的场景,如普通的网络图片传输。
- 小波域 :适用于对视觉质量要求较高、对压缩比有一定要求的场景,如医学图像、卫星图像等。
5. 图像压缩技术的发展趋势
5.1 混合编码技术
将变换域和小波域编码技术相结合,充分发挥各自的优势,以获得更高的压缩比和更好的视觉质量。例如,可以先对图像进行小波变换,然后对某些子带进行 DCT 变换,再进行量化和编码。
5.2 自适应编码技术
根据图像的内容和特征,自适应地选择合适的编码参数和方法。例如,对于细节丰富的区域采用更精细的编码方法,对于平滑区域采用更简单的编码方法,以提高压缩效率。
5.3 深度学习在图像压缩中的应用
利用深度学习模型学习图像的特征和统计规律,从而实现更高效的图像压缩。例如,使用卷积神经网络(CNN)对图像进行预处理和特征提取,然后进行压缩编码。
6. 总结与展望
6.1 总结
本文详细介绍了变换域和小波域图像压缩的相关知识,包括变换域图像压缩中的各种问题及解决方案,小波域图像压缩的原理、编码器设计要素和具体实现方法。通过对比变换域和小波域图像压缩的原理、性能和应用场景,我们可以看到它们各自的优缺点。同时,还探讨了图像压缩技术的发展趋势,如混合编码技术、自适应编码技术和深度学习在图像压缩中的应用。
6.2 展望
随着信息技术的不断发展,图像数据量越来越大,对图像压缩技术的要求也越来越高。未来的图像压缩技术将朝着更高的压缩比、更好的视觉质量和更低的计算复杂度方向发展。同时,深度学习等新兴技术的应用将为图像压缩技术带来新的突破和发展机遇。我们相信,在不久的将来,图像压缩技术将在更多的领域得到广泛应用,为人们的生活和工作带来更多的便利。
6.3 建议
- 对于初学者来说,可以先从变换域图像压缩入手,掌握基本的编码原理和方法,然后再学习小波域图像压缩。
- 在实际应用中,根据具体的需求和场景,选择合适的图像压缩技术。如果对计算资源要求较低、对压缩比要求不是特别高,可以选择变换域编码;如果对视觉质量要求较高、对压缩比有一定要求,可以选择小波域编码。
- 关注图像压缩技术的发展趋势,学习和掌握新兴技术,如深度学习在图像压缩中的应用,以提高自己的技术水平和竞争力。
6.4 常见问题解答
以下是一些关于图像压缩的常见问题及解答:
| 问题 | 解答 |
| — | — |
| 为什么小波域压缩在低比特率下视觉质量更好? | 小波变换能够更有效地将图像能量集中到少数系数上,并且在低比特率下的块效应相对较小,所以视觉质量更好。 |
| 如何选择合适的小波进行图像压缩? | 可以考虑小波的线性相位、正交性、滤波器长度和正则性等因素。一般来说,更倾向于使用较短、平滑的线性相位滤波器,且具有适度的正则性。 |
| 图像压缩中的电平偏移有什么作用? | 电平偏移可以使图像的像素值更集中在零附近,有助于提高量化的效率,从而获得略高的 SNR。 |
6.5 流程图总结
下面是一个 mermaid 格式的流程图,总结了图像压缩技术的整体发展和选择思路:
graph TD;
A[图像压缩需求] --> B{对计算资源要求};
B -- 低 --> C{对压缩比要求};
C -- 不高 --> D[变换域编码];
C -- 高 --> E{对视觉质量要求};
E -- 一般 --> D;
E -- 高 --> F[小波域编码];
B -- 高 --> F;
G[新兴技术发展] --> H[混合编码技术];
G --> I[自适应编码技术];
G --> J[深度学习在图像压缩中的应用];
H --> K[优化压缩效果];
I --> K;
J --> K;
D --> K;
F --> K;
K --> L[满足更高需求的图像压缩];
这个流程图展示了根据不同的图像压缩需求选择合适的编码技术,以及新兴技术对图像压缩效果的优化作用。通过这个流程图,可以更清晰地理解图像压缩技术的整体发展和选择思路。
希望本文能够帮助您更好地理解和应用图像压缩技术,在实际工作中取得更好的效果。如果您有任何问题或建议,欢迎随时交流。
超级会员免费看
10万+

被折叠的 条评论
为什么被折叠?



