实验4 基于DCT变换的信息隐藏算法

更新时间:2024-05-29 02:09:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

信息隐藏技术 实验报告

实验名称 日期 实验人

一、实验目的

(1)理解频域变换信息隐藏算法的基本思想 (2)理解离散余弦变换技术的基本理论

(3)掌握基于DCT变换信息隐藏的编码和解码过程

实验4 基于DCT变换的信息隐藏算法 2013-05-18 专业班级 学号 11信安1班 二、实验内容

载体图像为24位bmp图像LenaRGB.bmp,嵌入的秘密信息为从屏幕上随机输入的文本信息,要求对载体图像LenaRGB.bmp进行颜色分量分解与离散余弦变换,将秘密信息转换成二进制流并嵌入到载体图像的DCT变换域中,显示原载体图像、需要嵌入的秘密信息及其相应的二进制流、嵌入了秘密信息的伪装载体,提取的秘密信息。(编程语言不限)

三、实验步骤和设计思想

1. 对图片进行DCT变换,DCT以8x8的像块为单位进行,生成的是8x8的DCT系数数据块。

2. 量化:量化过程就是以某个量化步长去除DCT系数,对一个8x8的DCT变换块中的64个DCT变换系数采用不同的量化精度,以保证尽可能多地包含特定的DCT空间频率信息,又使量化精度不超过需要。DCT变换系数中,低频系数对视觉感应的重要性较高,因此分配的量化精度较细;高频系数对视觉感应的重要性较低,分配的量化精度较粗,通常情况下,一个DCT变换块中的大多数高频系数量化后都会变为零。 3. Z型扫描:

DCT变换产生的是一8x8的二维数组,为进行传输,还须将其转换为一维排列方式。有两种二维到一维的转换方式,或称扫描方式:之型扫描(Zig-Zag)和交替扫描,其中之型扫描是最常用的一种。由于经量化后,大多数非零DCT系数集中于8x8二维矩阵的左上角,即低频分量区,之型扫描后,这些非零DCT系数就集中于一维排列数组的前部,后面跟着长串的量化为零的DCT系数; 4. 游程编码:

只有非零系数被编码。一个非零系数的编码由两部分组成:前一部分表示非零系数前的连续零系数的数量(称为游程),后一部分是那个非零系数。这样就把之型扫描的优点体现出来了,因为之型扫描在大多数情况下出现连零的机会比较多,游程编码的效率就比较高。当一维序列中的后部剩余的DCT系数都为零时,只要

用一个“块结束”标志(EOB)来指示,就可结束这一8x8变换块的编码,产生的压缩效果是非常明显的。

四、程序清单

üTD??¢òt2× clc

clear all

%é????×?üD??¢2¢3aoo3è?t????à? M = text2bin(); len = length(M); Mstr = num2str(M);

Mstr = ['é?????±?D??¢??ó|μ??t????à?é?£1'Mstr'\\n']; fprintf(1,Mstr);

%RGB í?????è?2??aó?2??é C = imread('LeanRGB.bmp'); [m, n, d] = size(C); Cr = zeros(m, n); Cg = zeros(m, n); Cb = zeros(m, n);

for i = 1:m

for j = 1:n

Cr(i, j) = C(i, j, 1); Cg(i, j) = C(i, j, 2); Cb(i, j) = C(i, j, 3); end end

I = uint8(Cr); figure; imshow(I);

title('?-?×ì?í???');

I1 = blkproc(I, [8 8], 'dct2'); %????·?8*8í????é?′DD′òdct22?3? ca0 = im2col(I1, [8 8], 'distinct' ); %?×?ó?é3a3èàD üTD??¢òt2×±′á??y3ì for i = 1:len

if (M(i) == 0)

if (ca0(13, i) > ca0(20, i))

üT?μéy(4 1)1í(3 2)£???Ci(4 1) > Ci(3 2)?ò±′á?1 temp = ca0(13, i); ca0(13, i) = ca0(20, i); ca0(20, i) = temp; end else

if (ca0(13, i) < ca0(20, i))

temp = ca0(13, i); ca0(13, i) = ca0(20, i); ca0(20, i) = temp; end end

x = 0.000001;

a = abs(ca0(13, i) - ca0(20, i)); if (a < x)

if (M(i) == 0)

ca0(20, i) = ca0(20, i) + x; else

ca0(13, i) = ca0(13, i) + x; end end

end %μ???Biμ??μ

stegoDCT = col2im(ca0, [8 8], [m n], 'distinct'); stegoing = blkproc(stegoDCT, [8 8], 'idct2'); figure;

imshow(uint8(stegoimg));

title('DCT±?oo′|?í1óμ??±3°?×ì?'); üTD??¢òt2×?aá??y3ì TM =zeros(1, len); for i = 1:len

if ca0(13, i) > ca0(20, i) TM(i) = 1; else

TM(i) = 0; end end

MM = num2str(TM);

MM = ['ìμ??μ??×?üD??¢éò£1'MM'\\n']; fprintf(1, MM);

五、实验调试记录

六、实验结果及其分析

量化后的数据,有一个很大的特点,就是直流分量相对于交流分量来说要大,而且交流分量中含有大量的0。这样,对这个量化后的数据如何来进行简化,从而再更大程度地进行压缩呢。

对于前面量化的系数所作的 “Z”字形编排结果就是:

底部 ?26,?3,0,?3,?3,?6,2,?4,1 ?4,1,1,5,1,2,?1,1,?1,2,0,0,0,0,0,?1,?1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 顶部

838图像块经过 DCT 变换之后得到的 DC 直流系数有两个特点,一是系数的数值比较大,二是相邻838图像块的 DC 系数值变化不大。根据这个特点,JPEG 算法使用了差分脉冲调制编码(DPCM)技术,对相邻图像块之间量化 DC 系数的差值(Delta)进行编码。即充分利用相邻两图像块的特性,来再次简化数据。 即上面的 DC 分量-26,需要单独处理。 而对于其他63个元素采用zig-zag(“Z”字形)行程编码,以增加行程中连续0的个数。

七、实验心得

1、加入水印算法,从简单入手,空间域变换,最低域嵌入水印; 2、需找检测水印是否成功的方法,利用jpeg的算法替代h.264算法; 3、DCT代码,由于是嵌入式,算法尽量设计简单,考虑复杂度;

本文来源:https://www.bwwdw.com/article/llu7.html

Top