基于有序抖动块截断编码的水印嵌入和提取算法matlab仿真
1.算法运行效果图预览
噪声测试
旋转测试
压缩测试
2.算法运行软件版本
matlab2022a
3.算法理论概述
有序抖动块截断编码(Dithered Ordered Dithering with Truncation Coding, 简称DOTC)是一种在数字图像中嵌入水印信息的方法,该方法结合了抖动技术和量化误差隐藏原理,在保持视觉质量的同时,增强了水印的鲁棒性和隐蔽性。
步骤1,为增强系统鲁棒性和安全性,在水印嵌入前,先由秘钥key利用伪随机数发生器生成伪随机序列与水印图像进行异或计算以得到,调制水印序列Wd并嵌入宿主图像中。
Wd={Wd(ij)|Wd(i,j)=0或1,0<= i <=I1-1, 0<= j<=I2-1 }
步骤2,将原图像分为为N*N大小的无重叠块,对各子块采用ODBTC编码以实现分块区域内图像的二值化,并对重建电平做出如下处理。
1,若连续两个比特的嵌入水印信号为00,则将两重建电平u1,u2均量化为偶数。
2,若是连续两个比特的水印信号为01,则将重建电平u1量化为偶数,而将u2量化为奇数。
3,若连续两个比特的水印信号为为10,则将重建电平u1量化为奇数,而将u2量化为偶数。
4,若连续两个比特的水印信号为11,则将重建电平u1,u2均量化为奇数。
步骤3,用经步骤二处理后得到的重建电平,对原图像进行译码。
步骤4,不断重复步骤2和步骤3,直到原图像所有子块都已经被处理完或者水印信号嵌入完毕,即可得到含水印图像Lw。
(2),水印的提取。
水印的提取过程是水印嵌入的逆过程,具体描述如下。
输入:大小为大小为I1*I2的含水印图像Lw,水印大小为w1*w2,密钥key(伪随机数发生器种子)
输出:大小为w1*w2的水印图像。
步骤1,将待验证图像分为N*N大小的无重叠块,对各子块进行ODBTC编码,于是,根据重建电平的奇偶性即可恢复出各子块中隐藏的水印比特。
1,若重建电平的u1,u2为偶数,则提取出的水印信号00;
2,若重建电平的u1为偶数,u2为奇数,则提取出的水印信号为01;
3,若重建电平的u1为奇数,u2为偶数则提取出的水印信号为10;
4,若重建电平的u1,u2均为奇数,则提取出的水印信号为11。
步骤2,不断重复步骤1,直到图像中所有子块都处理完,或者水印信号已经提取完毕。恢复出对置乱水印序列Wd’。
步骤3,由密钥匙key对利用伪随机数发生器生成伪随机序列,对水印序列Wd’进行解调制,进而将原水印序列W’={W’(i,j)|W’(i,j)=0,1,0<= i<=m-1,0<= 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');