信息隐藏与数字水印实验教程的部分研究

信息隐藏与数字水印实验教程研究。主要是对《信息隐藏与数字水印实验教程 - 杨榆》的部分研究。因为当初研究比较细致,故挑出其中研究的部分内容如下。

图像信息隐藏与水印

对应书中第3章——图像信息隐藏与水印。

二值图像信息隐藏

二值图像:像素为0,黑色;像素为1,白色。

区域法

原理:方法是把一个二值图像分成一系列矩形图像区域B ,某个图像区域 B 中黑色像素的个数大于一
半,则表示嵌入0;如果白色像素的个数大于一半,则表示嵌入1。

游程法

首先介绍游程 run-length encoding:

活动长度就是游程的意思,下述图像的游程可以表示为,<1,3>,<0,3>,<1,4>,<0,2>,<1,2>
Alt

如果秘密信息位是0,则修改该游程长度为偶数;如果为1,则修改游程长度为奇数。如果秘密信息的取值与游程长度的奇偶性相匹配,则不改变游程长度。

偶数=0,奇数=1。在代码实现中,首先将图像拉成一个len*1数组,然后计算游程,根据游程进行修改。有些细节需要注意。

[think 1] 统计游程

while i < len(1) % len(1)表示len的第一维,不是函数
    or = oi(i,1); % orgin run
    count = 1;
    while (i<len(1) && oi(i+1,1)==or)
        i = i+1;
        count = count+1;
    end
    RLE(j) = count;
    j=j+1; % j是RLE的索引
    i=i+1; % i是图像数组的索引
end
% [think 1]
if i==len(1)
    RLE(j)=1;
end

为什么后面有个 RLE(j)=1 ?考虑图像长度末尾,-2,-1,0表示是与len(1)的相对位置。

-2   -1   0
0    0    1
0    0    0

如果是第一种情况,那么当i=len-1时,就已经跳出内循环然后i=i+1,跳出外循环,此时i=len,因此最后一个游程是1。
如果是第二种情况,那么当i=len-1时,仍然进入内循环,因此在内循环中实现i=i+1,然后再i=i+1,此时i=len+1,跳出循环。

[think 2]

% [think 2]
for x=1:2*l % 1(49)->2*l(108)
    modpoint = modpoint+RLE(x,1);
end

为什么x=1:2l?在看到修改01时,我就想到如果改了下一个,不就会影响下一个游程奇偶性嘛?如下图,假设嵌入01,就要修改两次,将1游程变成偶数,0游程变为奇数,这样每次嵌入下一个01比特时,都需要知道上一次嵌入是否修改了它的元素。事先记录的游程对于此时的情况不一定准确。
在这里插入图片描述
2则完美地解决了这个问题。同样嵌入01,因为修改只影响下一个游程,而使用的游程再下下一个位置,相当于一个缓冲游程,这样事先记录的游程,将非常有效。左图是某次嵌入游程的变化。
在这里插入图片描述

然后最后一点。隐藏信息时,改变游程的奇偶性是通过对下一个游程的第一个像素的像素值进行修改,因此当下一个游程的值为1时不能修改。看第二次修改明显把两个游程合体了。
在这里插入图片描述

Patchwork图像信息隐藏

典型patchwork方法

原理:随机选择两个集合A= {ai} 和B={bi} ,要求A和B中含有相同图像系数,设为n;将集合 A 中所有样点的像素值增加d ,同时将集合 B 中所有样点的像素值减少d ,这样两个集合中的样值都经过微
小的改动。

[think 1] 提取算法和嵌入算法的匹配
在这里插入图片描述
在嵌入算法有:横纵坐标之和偶加d,奇减d,因此所有偶数块和奇数块的像素差为:
r o w × c o l 2 × d − ( − d ) \frac{row \times col}{2}\times{d-(-d)} 2row×col×d(d)
而在提取算法中,tempa就是偶数块像素之后,tempb奇数块,提取判断如下。

(avea-aveb)>r*d

a v e a − a v e b = 2 × ( t e m p a − t e m p b ) r o w × c o l = 2 × r o w × c o l 2 × 2 d r o w × c o l = 2 d \begin{aligned} avea-aveb&=2\times\frac{(tempa-tempb)}{row\times col}\\ &=2\times \frac{\frac{row\times col}{2}\times 2d}{row\times col}\\ &=2d \end{aligned} aveaaveb=2×row×col(tempatempb)=2×row×col2row×col×2d=2d
而代码中 r 取值为1.6,同时对应的应该就是这里的2。

调色板图像隐写

嵌入算法如下:对调色板中所有颜色,把像素点的蓝色分量增加,然后将这种颜色添加到调色板中形成一个扩展调色板。根据需要嵌入的消息长度,随机选取隐藏的位置,当嵌入0 时,使用原调色板中的颜色,当嵌入1 时,使用扩展后调色板中的颜色。

[think 1]为什么map和wmap大小一样?按照原理应该是扩展来才对。
在这里插入图片描述

其实是调色板中后面很长没有用到,都为0。
在这里插入图片描述

DCT 域图像水印

原理:分别选择其中的两个位置,比如用 (x1, y1) 和 (x2, y2) 代表所选定的两个系数的坐标。如果Bi(x1, y1) < Bi(x2, y2) ,代表隐藏1; 如果相反,则交换两系数,如果Bi(x1, y1) > Bi (x2, y2)。代表隐藏0;如果相反,则交换两系数。

需要注意的是,在段代码中,并不是将选择分块中(5,2)和(4,3),分块起到的作用仅仅就是DCT变换。
在这里插入图片描述

for i=1:count
    if msg(i,1)==0
        if DCTrgb(i+4,i+1)<DCTrgb(i+3,i+2) % 选择(5,2)和(4,3)这一对系数
            temp=DCTrgb(i+4,i+1);
            DCTrgb(i+4,i+1)=DCTrgb(i+3,i+2);
            DCTrgb(i+3,i+2)=temp;
        end
    else
        if  DCTrgb(i+4,i+1)>DCTrgb(i+3,i+2)
            temp=DCTrgb(i+4,i+1);
            DCTrgb(i+4,i+1)=DCTrgb(i+3,i+2);
            DCTrgb(i+3,i+2)=temp;
        end
    end
    if DCTrgb(i+4,i+1)<DCTrgb(i+3,i+2)
        DCTrgb(i+4,i+1)=DCTrgb(i+4,i+1)-alpha; % 将原本小的系数调整更小,使得系数差别变大
    else
        DCTrgb(i+3,i+2)=DCTrgb(i+3,i+2)-alpha;
    end
end

完全脆弱图像水印

算法原理:校验和算法首先计算每个像素字节最高7 位的 Checksum 值,Checksum 值定义为一系列相同长度数据的二进制位的模2和。在该算法中,此长度为8个连续像素中的最高7位的联合长度,共56 位。在 Checksum 值计算过程中,整幅图像中的每个像素都参与计算,但每个像素只计算一次,最后结果为56 位的数据。该算法随后在图像中随机选取56个像素,将每个像素的最低位变为与上述 Checksum 比特位相同,以此存储Checksum 值,从而完成水印的嵌入。
在这里插入图片描述
在代码中,modpic是修改图像的意思(书上写错了),使用提取水印提 watermarked1.bmp 会发现被修改了(modified=1)。
在这里插入图片描述
代码和其他资源如下:

信息隐藏与数字水印实验教程的部分研究资源-其它文档类资源-CSDN文库

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值