基于有序抖动块截断编码的水印嵌入和提取算法matlab仿真

举报
简简单单做算法 发表于 2024/05/08 15:52:11 2024/05/08
【摘要】 1.算法运行效果图预览 噪声测试  旋转测试压缩测试 2.算法运行软件版本matlab2022a 3.算法理论概述       有序抖动块截断编码(Dithered Ordered Dithering with Truncation Coding, 简称DOTC)是一种在数字图像中嵌入水印信息的方法,该方法结合了抖动技术和量化误差隐藏原理,在保持视觉质量的同时,增强了水印的鲁棒性和隐蔽性。 ...

1.算法运行效果图预览

1.jpeg

2.jpeg

 

噪声测试

 

3.jpeg

4.jpeg

 

旋转测试

5.jpeg

6.jpeg

压缩测试

7.jpeg

8.jpeg

 

2.算法运行软件版本

matlab2022a

 

3.算法理论概述

       有序抖动块截断编码(Dithered Ordered Dithering with Truncation Coding, 简称DOTC)是一种在数字图像中嵌入水印信息的方法,该方法结合了抖动技术和量化误差隐藏原理,在保持视觉质量的同时,增强了水印的鲁棒性和隐蔽性。

 

步骤1,为增强系统鲁棒性和安全性,在水印嵌入前,先由秘钥key利用伪随机数发生器生成伪随机序列与水印图像进行异或计算以得到,调制水印序列Wd并嵌入宿主图像中。

 

Wd=Wdij|Wd(i,j)=010<= i <=I1-1  0<= j<=I2-1

 

步骤2,将原图像分为为N*N大小的无重叠块,对各子块采用ODBTC编码以实现分块区域内图像的二值化,并对重建电平做出如下处理。

 

1,若连续两个比特的嵌入水印信号为00,则将两重建电平u1u2均量化为偶数。

 

2,若是连续两个比特的水印信号为01,则将重建电平u1量化为偶数,而将u2量化为奇数。

 

3,若连续两个比特的水印信号为为10,则将重建电平u1量化为奇数,而将u2量化为偶数。

 

4,若连续两个比特的水印信号为11,则将重建电平u1u2均量化为奇数。

 

步骤3,用经步骤二处理后得到的重建电平,对原图像进行译码。

 

步骤4,不断重复步骤2和步骤3,直到原图像所有子块都已经被处理完或者水印信号嵌入完毕,即可得到含水印图像Lw 

 

2),水印的提取。

 

水印的提取过程是水印嵌入的逆过程,具体描述如下。

 

输入:大小为大小为I1*I2的含水印图像Lw,水印大小为w1*w2,密钥key(伪随机数发生器种子)

 

输出:大小为w1*w2的水印图像。

 

步骤1,将待验证图像分为N*N大小的无重叠块,对各子块进行ODBTC编码,于是,根据重建电平的奇偶性即可恢复出各子块中隐藏的水印比特。

 

1,若重建电平的u1u2为偶数,则提取出的水印信号00

 

2,若重建电平的u1为偶数,u2为奇数,则提取出的水印信号为01

 

3,若重建电平的u1为奇数,u2为偶数则提取出的水印信号为10

 

4,若重建电平的u1u2均为奇数,则提取出的水印信号为11

 

步骤2,不断重复步骤1,直到图像中所有子块都处理完,或者水印信号已经提取完毕。恢复出对置乱水印序列Wd’。

 

步骤3,由密钥匙key对利用伪随机数发生器生成伪随机序列,对水印序列Wd’进行解调制,进而将原水印序列W=W’(ij|W’(ij=010<= i<=m-10<= j<=m-1

 

完成水印提取。

 

 

 

 

4.部分核心程序

DA{block_size}=bayer_dither(block_size);
for i=1:block_size:n
    for j=1:block_size:m
        temp=X1(i:i+block_size-1,j:j+block_size-1);
        Bmax=max(max(temp));   
        Bmin=min(min(temp));
        k=Bmax-Bmin;
        DAk=DA{block_size}.*(k/(block_size^2-1));
        Th=DAk+Bmin;
        Xbinary=(temp>=Th);        
        n1=ceil(i/block_size); 
        m1=ceil(j/block_size);
        low_high((n1-1)*(m/block_size)+m1,1)=Bmin;   
        low_high((n1-1)*(m/block_size)+m1,2)=Bmax;  
        binary(i:i+block_size-1,j:j+block_size-1)=Xbinary;
    end
end
%在编码后的位平面中嵌入水印信息
%设置嵌入强度
Power     = 80;  
%设置块的大小
 
RR        = 45;
CC        = 45;
Mwk_binary= func_insert(binary,Imark,Power,RR,CC);
 
 
%噪声攻击
Mwk_binary= uint8(awgn(double(Mwk_binary),NOISE(jj),'measured'));
 
 
[Imark,Mwk_binarys] = func_desert(Mwk_binary,RR,CC,4);
 
figure(1);
subplot(122);
imshow(Imark,[]);
title('提取水印');
 
binary = Mwk_binarys;
[n,m]  = size(binary);
[l,h]  = size(low_high);
gray   = zeros(n,m);
block_size =(n*m/l)^0.5;
 
Imark0=imresize(Imark0,[45,45]);
PSNR(jj) = func_psnr((Imark0),(Imark));
NC(jj)   = func_nc((Imark0),(Imark)) ;
end
 
figure;
plot(NOISE,PSNR,'b-o');
grid on
xlabel('noise');
ylabel('PSNR');
 
figure;
plot(NOISE,NC,'b-o');
grid on
xlabel('noise');
ylabel('NC');
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。