LSB算法代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LSB数字水印算法的基本思想:改变二值图像的最低位不会对视觉效果产生影响,基于此,可以用水印信息直接代替数字图像的最低位。
嵌入过程主要分为三步:
一、将原始图像的空域像素值由十进制转换到二进制表;
二、用二进制水印信息中的每一比特信息替换与之相对应在第数据的最低有效位;
三、将得到的含水印的二进制数据转换为十进制像素值,从而获得含水印的图像。
%%%读入原始载体图像%%%%%
x=imresize(imread('_lena_std.bmp'),[256,256]);
[row,col]=size(x);
M=row;
N=col;
MN=col*row;
figure(1);imshow(x);
title('原始图像','Fontsize',16,'color','blue');
x_source=x;
%%%读入原始水印%%%%%
m=imresize(imread('lndx.bmp'),[256,256]);%!!!
for i=1:256
for j=1:256
if double(m(i,j))==0
w(i,j)=0;
else
w(i,j)=1;
end
end
end
%%%水印信息的嵌入%%%%%
s=x;
for i=1:256
for j=1:256
s(i,j)=bitset(x(i,j),weizhi,w(i,j)); %%weizhi=3,数越大,水印越明显%%
end %%数越小,水印越模糊(最低有效位的来历)end
imwrite(s,'lsb_watermarked.bmp');
figure(3);imshow(s);
title('嵌入水印后图像','Fontsize',16,'color','blue');
测试嵌入后图像的峰值信噪比PSNR(Peak Signal to Noise Ratio)【PSNR 是最普遍,最广泛使用的评鉴画质的客观量测法。
峰值信噪比经常用作图像压缩等领域中信号重建质量的测量方法,它常简单地通过均方差(MSE)进行定义。两个m×n单色图像I和K,如果一个为另外一个的噪声近似,那么它们的的均方差定义为:
峰值信噪比定义为:
图像压缩中典型的峰值信噪比值在30 到40dB 之间,愈高愈好。】
%%%计算PSNR%%%%%
x_tmp1=double(s)-double(x_source);%!!!
figure(2),imshow(s);
title('嵌入水印图像','Fontsize',16,'color','blue');
imwrite((uint8(round(100*x_tmp1))),'lsb_chazhi.bmp');
x_tmp2=x_tmp1(:);
x_tmp3=abs(x_tmp2);
x_tmp4=x_tmp3'*x_tmp3;
d_embed=x_tmp4/(M*M);
SDR1=255*255/d_embed;%!!!
psnr=10*log10(SDR1);
在网络中的图像,往往会受到一些攻击。下面介绍一些攻击代码:
%%%%各种攻击%%%%%
s=imread('lsb_watermarked.bmp');
J2=s;
%%%放大两倍的操作
if attack_style==1
xxx1=imresize(J2,2,'bicubic');
xxx2=imresize(xxx1,1/2,'bicubic');
yy=double(xxx2);
end
if attack_style==2
%%%%放大四倍的操作
xxx1=imresize(J2,4,'bicubic');
xxx2=imresize(xxx1,1/4,'bicubic');
yy=double(xxx2);
end
%%%%缩小1/4的操作
if attack_style==3
xxx1=imresize(J2,3/4,'bicubic'); xxx2=imresize(xxx1,4/3,'bicubic'); yy=double(xxx2);
end
if attack_style==4
xxx1=imresize(J2,2/4,'bicubic'); xxx2=imresize(xxx1,4/2,'bicubic'); yy=double(xxx2);
end
%%%3*3空域低通滤波
if attack_style==5
B=(1/9)*ones(3,3);
xxx2=filter2(B,J2);
yy=double(xxx2);
end
%%% 4领域平均%%%%
if attack_style==6
B=[0 1 0;1 0 1;0 1 0]*(1/4);
xxx2=filter2(B,J2);
yy=double(xxx2);
end
%%%%8领域平均%%%%
if attack_style==7
B=[1 1 1;1 0 1;1 1 1]*(1/8);
xxx2=filter2(B,J2);
yy=double(xxx2);
end
%%%%窗口中值滤波
if attack_style==8
xxx2=medfilt2(J2);
yy=double(xxx2);
end
if attack_style==9
a1=1;
b1=3;
xxx2=medfilt2(J2,[a1 b1]);
save a1 a1;
save b1 b1;
yy=double(xxx2);
end