1、第 4讲 基于调色板图像的隐写术 任德斌 四川大学电子信息学院 2 主要内容 索引图像介绍 基于索引图像的主要隐藏算法 对调色板排序 EZstego方法 颜色的量化索引调制 3 调色板图像格式和存储表示 基于调色板的图像使用特定颜色空间的一个颜色子集为图像上色,它包括两个部分 :调色板和实际的图像(索引)数据。实际的图像数据保存每个像素的调色板索引而非颜色值。 调色板类图像中最常用的有 GIF(Graphics Interchange Format)图像和索引类 BMP图像。 GIF格式采用 无损压缩 技术,普遍适用于图表,按钮等只需少量颜色的图像。 4 索引图像 B,map=imread(l
2、ena-ind.bmp); 5 调色板的概念 调色板是包含不同颜色的颜色表,每种颜色以红、绿、蓝三种颜色的组合来表示;图像的每一个像素对应一个数字,而该数字对应调色板中的一种颜色。 如某像素值为 1,则表示该颜色为调色板的编号为 1的颜色。调色板的单元个数是与图像的颜色数相对应的, 256色图像的调色板就有256个单元。不同的图像有不同的调色板。 6 索引图像 索引图像是一种把像素值直接作为 RGB调色板下标的图像。一幅索引图包含一个数据矩阵data和一个调色板矩阵 map, map矩阵总是一个 m 3的双精度类型矩阵( m表示颜色数目)。map矩阵的每一行指定一个颜色的红、绿、蓝颜色分量 。
3、索引图像可以把像素值直接映射为调色板数值,每一个像素的颜色使用 data的数值作为 map的下标来获得:数值 1表示 map的第一行,数值 2表示 map的第二行,依此类推。 7 索引 图像举例 map=1,0,0;0,1,0;0,0,1; A=ones(64); imshow(A,map) imshow(A+1,map) imshow(A+2,map) 8 RGB图像转化为索引图像 函数 rgb2ind的主要用法: data,map=rgb2ind(rgbimage,tol) 或 data,map=rgb2ind(rgbimage,n) tol是一个( 0,1)区间的实数,转换后的图像色彩数
4、量不大于 (floor(1/tol)+1)3 。 n是一个 0, 65535的整数,直接表示转换后的索引图的色彩数量。 9 一个直接的想法 能否对索引矩阵直接使用 LSB?为什么? 做实验 10 实验 直接把秘密信息嵌入到 gif图像索引数据的 LSB,并观察效果。 可以采用不同容量的嵌入,如30%,50%,70%,100% 一个示意代码: im,map=imread(garfield3.gif); l1,l2=size(im); r=uint8(round(rand(l1,l2); im2=bitand(im,254); em=bitor(im2,r); subplot(1,2,1);ims
5、how(im,map);title(原始图像 ); subplot(1,2,2);imshow(em,map);title(伪装图像 ); 11 实验结果 12 原因 由于调色板并不要求有任何的排序,故调色板中相邻位置对应的颜色不一定具有视觉的相似性 。因此,简单的修改图像数据的LSB,可能会导致颜色的跳跃变化。 13 方法 一:修改调色板的 LSB 对调色板中的颜色向量的 LSB修改 。 对颜色向量 ci的轻微改变 (最低比特位 )可以不引起 HVS的察觉。 隐藏容量很小: 3 N 14 方法二:对调色板排序 用调色板的排序方式对信息进行编码 。 在图像的存储中,调色板不需要以任何方式排序,
6、因此在以调色板保存颜色时,可以选择对信息进行编码。因为有 N!个不同的方式对调色板进行排序,所以可以用来对一个短信息进行编码。 GifShuffle软件使用该方法。 对于 256色的调色板可以嵌入的消息位数为: 1684 15 索引 图像举例 map=1,0,0;0,1,0;0,0,1; A=ones(64); imshow(A,map) imshow(A+1,map) imshow(A+2,map) 16 基于调色板排序的例子 要保持图像不变,能不能只把调色板的顺序进行变换? map2=map; map2(1,:)=map(2,:); map2(2,:)=map(1,:); imshow(A
7、,map2); 显然不能! B=A+1; imshow(B,map2); 17 基于调色板排序的例子 (续 ) 图像 A,map中能嵌入几位信息? map可以有多少种排序? 不同的排序代表什么含义?这取决于不同的算法。 A2,map2=SortPalletHiding(A,map,1); imshow(A2,map2); msg2=ExtractFromSortPallet(map2); A3,map3=SortPalletHiding(A,map,11); 18 基于调色板排序的思想 先定义颜色的顺序; 再定义调色板的顺序; 把所有的调色板按照从小到大的顺序排列成一张表; 在 data,ma
8、p中隐藏的信息就是该 map在表中的索引。 19 程序演示 data,map=imread(garf21.bmp); msg=7777; newdata,newmap=SortPalletHiding(data,map,msg); figure;imshow(data,map);title(the ori); figure;imshow(newdata,newmap);title(the stego); msg2=ExtractFromSortPallet(newmap) 20 对调色板排序隐藏的特点 图像质量没有任何降低; 嵌入容量很小,不超过 1684位 ; 非常脆弱,重新存储会丢失其中隐
9、藏的秘密信息 (许多图像处理软件会按照颜色值对调色板排序,但画图软件不会 ); 调色板中 “ 无序 ” 的颜色序列很容易引起怀疑, Fridrich指出许多软件生成的调色板是按照亮度、使用频率等要素排列。 21 如何提高嵌入容量 使用索引矩阵! 22 一个直接的解决思路 先对调色板进行排序,使得相邻的颜色尽可能的相像; 再使用 LSB进行嵌入; 为了避免怀疑,可以再把调色板还原,这步是可选的。 23 隐写方法三: EZstego方法 1. 采用某种距离准则,对调色板进行排序,使调色板中的两个相邻颜色向量具有相似的颜色感觉 (实现时的相对难点) ; 2. 进行 LSB替换 ; 3. 最后把调色板
10、进行还原。 EZstego软件 采用该方法 有很多不同的排序方法 亮度排序 将颜色根据它们在色彩空间中的欧几里德距离进行排序( EZstego软件 ) : 222 BGRd 24 EZsteg-调色板排序 使得 sum(distance(c(i),c(i+1)最小 25 EzStego的排序算法 26 EZstego的嵌入方法举例 对调色板排序,然后相邻的颜色进行配对,最后根据消息进行选择。 如秘密消息为 10110 索引矩阵的前面几个系数为 3, 7, 6, 2, 0 问嵌入后的值为多少? 27 EZsteg的特点 优点: 不改变调色板中的颜色值或顺序,并且没有增加图像的信息长度 缺点: 直
11、方图攻击 该算法对调色板中所有颜色保证了 整体最优 ,却忽视了 局部最优的情况 ,即没有保证替换前后的两个颜色在调色板颜色序列中的空间位置最近 可能引起图像质量的较大改变 28 隐写方法四: Fridrich算法 特点:不需要对调色板进行排序 输入 : 索引矩阵 I, 调色板 C = c1, c2, . . . , cL, 消息 m 输出 :索引矩阵 J for m 的每个位 b 选择 I中的一个点 I(x,y) if I(x,y) mod 2 b 寻找 ci C 满足 i mod 2 = b 且 ci 和 I(x,y)对应的颜色最接近 I(x,y) = i end end 实现时,对每个颜色 ci ,应该先找到和它颜色最接近的 cj,且 j和 i的奇偶性相反 29 Fridrich算法的特点 实现简单,效率更高,特别是对提取算法 也不能实现颜色替换的局部最优,其实现效果不一定比 Ezstego算法更好 可能引起图像质量的较大改变 30 隐写方法五:最佳奇偶分配密写( OPA) 将调色板中的颜色划分为两个子集,分别代表 0, 1比特 实现方法: 计算所有不同颜色 Ci和 Cj的距离 dij,并按照从大到小的顺序进行排序,最近的两种颜色用有向线段连接(构成一个有向图) 一条边上的颜色属于不同的子集 ,即对于不同的秘密消息 。 特点: Ci离 Cj最近,但 Cj离 Ci不一定最近