信息隐藏——第三章 载体信号的时频分析

一、离散 Fourier 变换
1.DFT原理
在图像变换中, 最基础的变换就是 Fourier 变换, Fourier 变换分为连续形式的和离散形式的, 在计算机上使用的 Fourier 变换通常都是离散形式的, 即离散傅氏变换DFT,即 将离散信号的 Fourier 变换再离散化。
计算 DFT 存在快速算法( FFT)
2.应用实例
①快速卷积

>> A = magic( 3) ; B = ones( 3) ;
>> A( 8, 8) = 0; B( 8 , 8) = 0 ;
>> A2 = fft2( A) ;
>> B2 = fft2( B) ;
>> M = A2* B2;
>> C = ifft2( M) ;
>> C = C( 1∶5, 1∶5 ) ;
>> C = real( C) ;

以上这段程序的过程如下: 先用 1 ~9 之间的数产生一个 3× 3 方阵 A, 再生成一个全 1 的 3× 3 方阵 B, 用 0 将 A 和 B 分别补成 8× 8 方阵, 对 A 和 B 进行 Fourier 变换, 将变换的结果在频域内进行点乘, 最后将点乘的结果变回空域, 并截取有效数据
②图像 Fourier 变换实例

>> f = imread( ′lenna. jpg′) ;
>> F = fft2( f) ;
>> F1 = log( abs( F) ) ; % 求幅值
>> imshow( F1, [ - 1 25] ) ;
>> F2 = fftshift( F) ; % 如图 3 . 3 换位
>> F3 = log( abs( F2 ) ) ; % 求幅值
>> imshow( F3, [ - 1 25] ) ;
>> F4 = ANGLE( F) ; % 求相位
>> imshow( F4, [ - 1 5] ) ;

二、离散余弦变换
1.DCT原理
离散余弦变换( Discrete Cosine Transform, DCT) 是一种实数域变换, 其变换核为实数的余弦函数。利用 Fourier 变换的对称性, 采用图像边界褶翻操作将图像变换为偶函数形式, 然后对这样的图像进行二维离散 Fourier 变换, 变换后的结果将仅包含余弦项, 故称为离散余弦变换。对一幅图像进行离散余弦变换, 有这样的性质: 许多有关图像的重要可视信息都集中在 DCT 变换的一小部分系数中。因此, 离散余弦变换( DCT) 是有损图像压缩 JPEG 的核心, 同时也是所谓“变换域信息隐藏算法”的主要“变换域( DCT 域) ”之一。因为图像处理运用二维离散余弦变换, 所以在此我们直接介绍二维 DCT。
2.DCT的MATLAB实现
MATLAB 提供了两种实现离散余弦变换的方法, 即两种函数。
①第一种方法是使用函数 dct2, 该函数使用一个基于 FFT 的快速算法来提高当输入较大的输入方阵时的计算速度。dct2 函数的调用格式如下:
B = dct2( A, [ M N] ) 或B = dct2( A, M, N)
其中, A表示要变换的图像, M 和 N 是可选参数, 表示填充后的图像矩阵大小。B 表示变换后得到的图像矩阵。
②第二种方法使用由函数 dctmtx 返回的 DCT 变换矩阵, 按照式( 3. 6) 所表明的方法完成图像 DCT。这种方法较适合于较小的输入方阵( 如 8× 8 或 16× 16 方阵) 以及后面我们通常要使用到的分块 DCT( block DCT) 。
dctmtx 的调用格式如下:D = dctmtx( N)
其中, N 表示 DCT 变换矩阵的维数, D 表示得到的 N 维 DCT 变换矩阵。

先对图像整体做 DCT 变换:

>> RGB = imread( ′c: \ lenna. jpg′) ;
>> RGB = double( RGB) /255 ;
>> RGBr = RGB( : , : , 1) ; % 提取 R 层做 DCT
>> DCTmatrix = dct2( RGBr) ;
>> subplot( 1, 2 , 1) , imshow( RGB) ; title( ′原始图像′)
>> subplot( 1, 2 , 2) , imshow( log( abs( DCTmatrix) ) , [ ] ) , colormap( jet( 64) ) ;
>> title( ′图像 DCT 系数的光谱表示′) ;

接下来对 lenna 图像做 8× 8 的分块 DCT。
我们必须先产生一个阶数为 8 的正交 DCT 变换矩阵。利用前面说的 dctmtx 函数, 输入 dctmtx( 8 ) , 得到阶数为 8 的正交 DCT 变换矩阵
继而利用 blkproc 函数完成分块操作, blkproc 函数的调用格式如下:
B = blkproc( A, [ m n] , fun, P 1, P2, …)
其中 A为原始信号矩阵, [ m n] 为分块的大小, fun 为对每一个分块 x 的操作规则, P i 是 fun 中调用的参数。对图像进行 8× 8 DCT 分块操作的代码如下:

>> RGB = imread( ′lenna. jpg′) ;
>> RGB = double( RGB) /255 ;
>> RGB = reshape( RGB, 256, 256* 3) ; % 将三维 RGB 矩阵变为二维
>> T = dctmtx( 8) ;
>> blocDCTmatrix = blkproc( RGB, [ 8 8] , ′P1 * x* P2′, T, T′) ;

3.J PEG 压缩算法中的离散余弦变换( DCT) 编码
变换编码就是在频域对图像进行编码。其基本思想是将空域中描述的图像数据经过某种正交变换( 诸如 Fourier 变换、离散余弦变换等) 转换到另一个变换域( 频率域) 中进行描述, 变换后的结果是产生一批变换系数, 然后对这些变换系数进行编码处理, 从而达到压缩图像数据的目的。
首先将原始图像分成子块, 每一子块经正交变换、量化、编码后由信道传输到接收端, 接收端作解码、反量化、逆变换, 恢复原图像
基于 DCT 的压缩编码算法是有失真的压缩编码
变换编码、解码工作流程图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值