DCT域三点法隐写提取算法(matlab)

三点法的隐写算法原理

原理:利用DCT中频系数中的三个系数之间的相对关系来对秘密信息进行编码。

具体实现

(1)选取三个位置,我选择的是(2,3)(3,2)(4,1)这三个点
(2)首先规定:当B(2,3)>B(3,2)>B(4,1)的时候,这个块表示嵌入1;
其次当B(2,3)<B(3,2)<B(4,1)的时候,这个块表示嵌入0;
    当B(2,3)<B(4,1)<B(3,2)或者B(2,3)>B(4,1)>B(3,2)的时候,这个块表示无效块。
(3)If 要嵌入的信息=0时
首先判断
if B(2,3)>B(3,2)>B(4,1) ,说明需要对这个快进行修改所以exchange(B(4,1),B(3,2))。原因:如果强行将这个改为B(2,3)<B(3,2)<B(4,1)所做的修改比较大,所以这里我们直接将它变为无效块,然后continue。
If not: 
If B(2,3)<B(3,2)<B(4,1) ,说明不需要做修改,这是最理想的情况。直接continue跳过。
If B(2,3)>B(3,2),说明这两个关系是需要做出修改的,所以我们exchange(B(2,3),B(3,2)),然后continue。
If B(3,2)>B(4,1),说明这两个点的关系是需要做出修改的,所以进行exchange(B(3,2),B(4,1))将他们进行交换。然后continue结束。
(4)If 要嵌入的信息=1时:
首先判断:
if B(2,3)<B(3,2)<B(4,1) ,说明需要对这个快进行修改所以exchange(B(4,1),B(3,2))。原因:如果强行将这个改为B(2,3)>B(3,2)>B(4,1)所做的修改比较大,所以这里我们直接将它变为无效块,然后continue。
If not: 
If B(2,3)>B(3,2)>B(4,1) ,说明不需要做修改,这是最理想的情况。直接continue跳过。
If B(2,3)<B(3,2),说明这两个关系是需要做出修改的,所以我们exchange(B(2,3),B(3,2)),然后continue。
If B(3,2)<B(4,1),说明这两个点的关系是需要做出修改的,所以进行exchange(B(3,2),B(4,1))将他们进行交换。然后continue结束。
(5)当完成以上的操作之后,所有的信息其实已经隐写到了我们的目标图片中,但是还需要考虑隐藏的健壮性,也就是还需要一个参数D,作用是防止由于传输或者转换过程中的噪声或者其他因素的影响导致的相近DCT|数值的两个点的大小关系的偶然变化。这样就可能导致本来是一个无效块但是可以读出信息,这样的话就会影响信息的提取。
在这里我的方法是对每一个块再进行一次操作,
If B(2,3)>B(3,2)>B(4,1)
B(2,3)=B(2,3)+D
B(4,1)=B(4,1)-D
Else: 
If B(2,3)<B(3,2)<B(4,1)
B(2,3)=B(2,3)-D
B(4,1)=B(4,1)+D
这样就完成了对于隐藏健壮性的提高。

三点法的隐提取算法原理

原理:根据隐写时候的算法的原理(
当B(2,3)>B(3,2)>B(4,1)的时候,这个块表示嵌入1;
其次当B(2,3)<B(3,2)<B(4,1)的时候,这个块表示嵌入0;
当B(2,3)<B(4,1)<B(3,2)或者B(2,3)>B(4,1)>B(3,2)的时候,这个块表示无效块。

我们逐个对块的B(2,3)>,B(3,2),B(4,1)的大小关系进行判断。
If B(2,3)>B(3,2)>B(4,1):
则提取出1
Else :
If B(2,3)<B(3,2)<B(4,1):
则提取出0
Else
跳过,查找下一个块。

代码

这里由于我后续的需要,我给的是两点法的代码,其中只需要按照上面我描述的伪代码对隐写和提取部分的if else部分进行很少的修改。
gitee地址

发布了31 篇原创文章 · 获赞 33 · 访问量 2851

猜你喜欢

转载自blog.csdn.net/qq_40742298/article/details/102756401