MATLAB数字水印系统

  • 课题介绍

本课题为基于MATLAB的小波变换dwt和离散余弦dct的多方法对比数字水印系统。带GUI交互界面。有一个主界面GUI,可以调用dwt方法的子界面和dct方法的子界面。流程包括,读取宿主图像和水印图像,嵌入,多种方法的攻击(剪切,加噪,旋转等),提取,最后利用psnr峰值信噪比进行评价不同攻击下,鲁棒性的好坏。

  • GUI界面
  • 源码
  1. 读取宿主图像

name,path=uigetfile({'*.bmp';'gif'},'载入图像');

X=imread(path,name); %获取位置

axes(handles.axes1);%axes表示获取位置,这里选取的位置为axes1;

imshow(X); %显示图像

save('X'); %保存变量

guidata(hObject,handles) %更新结构体;

  1. 读取水印图像

name,path=uigetfile({'*.bmp';'gif'},'载入图像');

W=imread(path,name); %获取位置

axes(handles.axes2);%axes表示获取位置,这里选取的位置为axes1;

W=rgb2gray(W)

W=imresize(W,64 64)

imshow(W); %显示图像

save('W'); %保存变量

guidata(hObject,handles) %更新结构体;

  1. 嵌入

for i = 1:64

ref1(i)=mean(lowarray(:,i)); %对矩阵每列求均值

ref2(i)=mean(lowarray(i,:)); %对矩阵每行求均值

for j=1:64

w(i,j,:)=int8(dec2bin(W(i,j),8))-48; %dec2bin将矩阵W的每个元素转换成二进制值,每个二进制长度为8

result(i,j,1)=xor(w(i,j,1),(lowarray(i,j)>ref1(i)));

result(i,j,2)=xor(w(i,j,2),(lowarray(i,j)>ref2(i)));

end

end

for i=1:4096

ref3tmp=XCsource(16381+4\*i:16384+4\*i);%128*128=16384

ref3(i)=mean(ref3tmp);

ref4tmp=XCsource(32765+4\*i:32768+4\*i);%128*256=32768

ref4(i)=mean(ref3tmp);

ref5tmp=XCsource(49149+4\*i:49152+4\*i);%(128+64)*256=49152 or (128+256)*128=49152

ref5(i)=mean(ref5tmp);

ref6(i)=mean(ref6tmp);

ref7tmp=XCsource(131057+16\*i:131072+16\*i);%256*512=131072

ref7(i)=mean(ref7tmp);

ref8tmp=XCsource(196593+16\*i:196608+16\*i);%(128+256)*512=196608

ref8(i)=mean(ref8tmp);

end

  1. 攻击

if get(handles.radiobutton1,'value')

option=1;

q=num2str(get(handles.edit3,'string'))

Z = imrotate(Z,q,'crop');%旋转 角度可以控制

elseif get(handles.radiobutton2,'value')

option=2;

q1=str2num(get(handles.edit4,'string'))

q2=str2num(get(handles.edit6,'string'))

q3=str2num(get(handles.edit7,'string'))

q4=str2num(get(handles.edit8,'string'))

Z(q1:q2,q3:q4)=255;%剪切 区间和嵌入值可以控制

elseif get(handles.radiobutton3,'value')

option=3;

q=str2num(get(handles.edit5,'string'))

Z=imnoise(Z,'gaussian',q);%加噪声 选择参数 help imnoise

elseif get(handles.radiobutton4,'value')

option=4;

Z=Z

end

axes(handles.axes4)

imshow(Z,\[\]);

  1. 提取

for i =1:64

for j=1:64

pick(i,j,3)=xor(std(i,j,3),(lowarray(i,j)>(alaph3*reref3(i,j))));

pick(i,j,4)=xor(std(i,j,4),(lowarray(i,j)>(alaph4*reref4(i,j))));

pick(i,j,5)=xor(std(i,j,5),(lowarray(i,j)>(alaph5*reref5(i,j))));

pick(i,j,6)=xor(std(i,j,6),(lowarray(i,j)>(alaph6*reref6(i,j))));

pick(i,j,7)=xor(std(i,j,7),(lowarray(i,j)>(alaph7*reref7(i,j))));

pick(i,j,8)=xor(std(i,j,8),(lowarray(i,j)>(alaph8*reref8(i,j))));

end

end

for i=1:64

for j=1:64

od=double(reshape(pick(i,j,:),1,8));

dec(i,j)=bin2dec(char(od+48));

end

end

  1. psnr计算

origImg = double(origImg);

distImg = double(distImg);

M N = size(origImg);

error = origImg - distImg;

MSE = sum(sum(error .* error)) / (M * N);

if(MSE > 0)

PSNR = 10*log(255*255/MSE) / log(10);

else

PSNR = 99;

end

相关推荐
一只不想敲代码的程序猿1 小时前
如何更高效地拆解问题?
算法
微尘hjx2 小时前
【Deep-OC-SORT 02】多轨迹算法Deep-OC-SORT-相对 OC-SORT 的改进点
人工智能·算法·yolo·目标跟踪·视觉检测·ultralytics·deep-oc-sort
梦帮科技2 小时前
意识启发式量子隧穿退火算法用于全局优化 (CITA) 完整技术指南
网络·人工智能·算法·量子计算·模拟退火算法
一去不复返的通信er3 小时前
排序 + 双指针:力扣15三数之和
算法·leetcode
Pniubi4 小时前
力扣3无重复字符的最长字串(滑动窗口)
算法·leetcode·职场和发展
On The Road :4 小时前
深入理解 JVM 垃圾回收:GC 是什么、如何判定垃圾、四大回收算法全解析
jvm·算法
微尘hjx5 小时前
【Deep-OC-SORT 03】多轨迹算法Deep-OC-SORT-卡尔曼滤波预测过程
算法·yolo·目标跟踪·ultralytics·车跟踪·轨迹算法·deep-oc-sort
老师我太想进步了20267 小时前
【数据结构-3】算法美学之降复杂度
数据结构·算法
机器人零零壹12 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
ZhengEnCi15 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法