DCT实现水印嵌入与提取(带攻击)
问题:
想要用DCT技术,在Matlib上实现水印的隐藏和提取(带GUI界面),且加上一些攻击(噪声、旋转、裁剪),以及用NC值评判!
流程#
选择载体#
1 2 3 4 5 6 7 8 9 | [filename,pathname]= uigetfile ({ '*.bmp' ; '*.jpg' ; '*.*' }, '选择图片' ); %文件选择,这里可以选择可以打开的图片格式 str=[pathname filename]; %被选择的文件路径 [handles.I,handles.map]= imread (str); %读取图片 zai= imread (str); %zai=[handles.I,handles.map]; psnr_cover= double (zai); guidata (hObject,handles); %图像串行化,保存在hObject,这样我整个页面都能取到handles的值 axes (handles.axes1); %把显示范围限定在axes1 imshow(zai,[]); %显示图片 |
选择要嵌入的水印#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [filename,pathname]= uigetfile ({ '*.bmp' ; '*.jpg' ; '*.*' }, '选择图片' ); %文件选择,这里可以选择可以打开的图片格式 str=[pathname filename]; %被选择的文件路径 [handles.I,handles.map]= imread (str); %读取图片 %water=[handles.I,handles.map]; global water; water= imread (str); water=rgb2gray(water); water= double (water)/255; water= ceil (water); %guidata(hObject,handles);%图像串行化,保存在hObject,这样我整个页面都能取到handles的值 axes (handles.axes4); %把显示范围限定在axes4 imshow(water); %显示图片 dimI= size (water); global rm; global cm; rm=dimI(1);cm=dimI(2); |
嵌入#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | start_time= cputime ; global water; global rm; global cm; cda0=blkproc(handles.I,[8,8], 'dct2' ); mark=water; alpha =10; global k1; global k2; k1= randn (1,8); k2= randn (1,8); [r,c]= size (handles.I); cda1=cda0; % cda1 = 256_256 for i =1:rm % i=1:32 for j =1:cm % j=1:32 x=( i -1)*8;y=( j -1)*8; if mark( i , j )==1 k=k1; else k=k2; end cda1(x+1,y+8)=cda0(x+1,y+8)+ alpha *k(1); cda1(x+2,y+7)=cda0(x+2,y+7)+ alpha *k(2); cda1(x+3,y+6)=cda0(x+3,y+6)+ alpha *k(3); cda1(x+4,y+5)=cda0(x+4,y+5)+ alpha *k(4); cda1(x+5,y+4)=cda0(x+5,y+4)+ alpha *k(5); cda1(x+6,y+3)=cda0(x+6,y+3)+ alpha *k(6); cda1(x+7,y+2)=cda0(x+7,y+2)+ alpha *k(7); cda1(x+8,y+1)=cda0(x+8,y+1)+ alpha *k(8); end end global a1; a1=blkproc(cda1,[8,8], 'idct2' ); a_1= uint8 (a1); axes (handles.axes5); %把显示范围限定在axes5s imshow(a_1); %显示图片 %imwrite(a_1,'嵌入水印后的图.bmp','bmp'); %subplot(2,3,3),imshow(a1,[]),title('嵌入水印后的图像'); %disp('嵌入水印处理时间') embed_time= cputime -start_time set (handles.text13, 'string' , num2str (embed_time)); p0=a_1; |
攻击#
1、白噪声攻击
1 2 3 | gong=a1; noise0=1* randn ( size (gong)); gong= uint8 (gong+noise0); |
2、椒盐噪声
1 | gong=imnoise( uint8 (a1), 'salt & pepper' , 0.01); %添加密度为0.01的椒盐噪声 |
3、旋转
1 | gong= uint8 (imrotate( uint8 (a1),30, 'nearest' , 'crop' )); |
4、裁剪
1 2 3 4 5 6 7 | %原图进行分色并剪切 gong=a1; I_r= gong(:,:,1); I_r(1:128,1:128)=255; %三色通道合并 gong(:,:,1) = I_r; gong= uint8 (gong); |
提取#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | global k1; global gong; global k2; global water; dimI= size (water); psnr_watermarked= double (gong); dca1=blkproc(gong,[8,8], 'dct2' ); p= zeros (1,8); for i =1:dimI(1) %行 for j =1:dimI(2) % j=1:32列 x=( i -1)*8;y=( j -1)*8; p(1)=dca1(x+1,y+8); p(2)=dca1(x+2,y+7); p(3)=dca1(x+3,y+6); p(4)=dca1(x+4,y+5); p(5)=dca1(x+5,y+4); p(6)=dca1(x+6,y+3); p(7)=dca1(x+7,y+2); p(8)=dca1(x+8,y+1); if corr2(p,k1)>corr2(p,k2), warning off MATLAB:divideByZero; mark1( i , j )=1; else mark1( i , j )=0; end end end axes (handles.axes7); %把显示范围限定在axes5s imshow(mark1); %显示图片 embed_time= cputime -start_time; set (handles.text14, 'string' , num2str (embed_time)); NC=nc(mark1,water) %调用nc.m子函数 set (handles.text15, 'string' , num2str (NC)); |
结果#
参考#
1、数字水印常见攻击类型汇总,噪声,缩放,旋转,剪切(附matlab代码)
作者:Hang Shao
出处:https://www.cnblogs.com/pam-sh/p/14890278.html
版权:本作品采用「知识共享」许可协议进行许可。
声明:欢迎交流! 原文链接 ,如有问题,可邮件(mir_soh@163.com)咨询.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)