您好,欢迎访问三七文档
基于DCT变换域的水印嵌入和提取一、原始图像被随机攻击的源程序:%functionrandom_damage()functionrandom_damage()file_name='tt.jpg';oriwat_img=imread(file_name);%computethesizeH=size(oriwat_img,1);W=size(oriwat_img,2);%随机产生行、列,破坏row1=unidrnd(512);row2=unidrnd(512);column1=unidrnd(512);column2=unidrnd(512);if(row1row2)temp=row1;row1=row2;row2=temp;endif(column1column2)temp=column1;column1=column2;column2=temp;endattack_img=oriwat_img;fori=row1:row2forj=column1:column2attack_img(i,j)=unidrnd(255);endend%settheattackedimageimwrite(attack_img,'muc_attacked.bmp','bmp');count=(column2-column1+1)*(row2-row1+1)subplot(1,2,1);imshow(oriwat_img)title('OriginalWatermarkedImage')subplot(1,2,2);imshow(attack_img)title('AttackedImage')该实验程序所产生的实验结果为:由于该程序是通过产生随机序列而对图像进行攻击的,所以所产生的的实验结果每次都会有所不同,而上图的实验结果也是所显示的几个图像里面被攻击的效果最明显程度最严重的一个。二、普通水印的嵌入和提取的源程序:M=8;%原图像长度N=8;%水印图像长度K=8;I=zeros(M,M);J=zeros(N,N);B=zeros(K,K);I=imread('muc.jpg');%读入原图像subplot(221)imshow(I);title('原图像');%显示水印图像%randn('seed',10);%mark=randn(1024,1);%subplot(2,2,2);%plot(mark);%title('水印序列');L=imread('c.jpg');J=rgb2gray(L)subplot(2,2,2);imshow(J);title('水印图像');%嵌入水印T=1;form=1:Nforn=1:Nx=(m-1)*K+1;y=(n-1)*K+1;B=I(x:x+K-1,y:y+K-1);%将原图分成8*8的子块B=dct2(B);%对子块进行DCT变换ifx==1&y==1a=0.002;elsea=0.5;endB=B*(1+a*mark(T));%嵌入水印B=idct2(B);%进行DCT反变换I(x:x+K-1,y:y+K-1)=B;T=T+1;endendsubplot(2,2,3);imshow(I);%显示嵌入水印后的图像title('嵌入水印后的图像');imwrite(I,'嵌入后的图像.jpg');%从嵌入水印的图像中提取水印I=imread('muc.jpg');J=imread('c.jpg');form=1:Nforn=1:Nx=(m-1)*K+1;y=(n-1)*K+1;B1=I(x:x+K-1,y:y+K-1);B2=J(x:x+K-1,y:y+K-1);B1=idct2(B1);B2=idct2(B2);a=B2(1,1)/B1(1,1)-1;ifa0W(m,n)=0;elseW(m,n)=1;endendend%显示提取的水印subplot(224)imshow(W);title('从含有水印图像中提取的水印');该程序运行后产生的实验结果为:在这个程序运行之前,有一个错误的程序,运行的过程中总是无法提取出有效的水印,由于算法的不正确,再加上自己之前并没有意识到图片的大小的问题所以总是出现错误的结果最终通过对算法的改正和图片大小的修正出现了自己想要的结果,下图则是出现错误的水印,但是我们还是可以通过这个错误的图像发现它所实现的功能里面对于水印的嵌入还是有着很明显的效果,只是这样的结果又在安全性上大打折扣:出现错误的水印提取三、两种噪声加入后的源程序;M=imread('muc.jpg');%读取原始的图像subplot(2,2,1);imshow(M);%显示原始图像title('原始图像');P1=imnoise(M,'gaussian',0.02);%加入高斯躁声subplot(2,2,2);imshow(P1);%加入高斯躁声后显示图像title('加入高斯噪声图像');P2=imnoise(M,'salt&pepper',0.02)%加入椒盐躁声subplot(2,2,3);imshow(P2);%加入椒盐躁声后显示图像title('加入椒盐噪声图像');该实验程序运行后所执行的结果为:该程序在运行过程中始终很顺利,所以对于实验结果的获得也是显得很轻松。四、加入高斯噪声后的图像以及从高斯噪声中提取出水印的源程序:clearall;M=512;N=64;K=8;I=zeros(M,M);J=zeros(N,N);BLOCK=zeros(K,K);subplot(2,2,1);I=imread('muc.jpg');imshow(I);title('原始图像');subplot(2,2,2);J=imread('t1.bmp');imshow(J);title('水印图像');forp=1:Nforq=1:Nx=(p-1)*K+1;y=(q-1)*K+1;BLOCK=I(x:x+K-1,y:y+K-1);BLOCK=dct2(BLOCK);ifJ(p,q)==0a=-1;elsea=1;endBLOCK(1,1)=BLOCK(1,1)*(1+a*0.03);BLOCK=idct2(BLOCK);I(x:x+K-1,y:y+K-1)=BLOCK;endendsubplot(2,2,3);imshow(I);title('嵌入水印后的图像');imwrite(I,'watermarked.bmp','bmp');I1=zeros(M,M);J1=zeros(M,M);BLOCK1=zeros(K,K);BLOCK2=zeros(K,K);I1=imread('muc.jpg');J1=imread('watermarked.bmp','bmp');w=zeros(N,N);forp=1:Nforq=1:Nx=(p-1)*K+1;y=(q-1)*K+1;BLOCK1=I1(x:x+K-1,y:y+K-1);BLOCK2=J1(x:x+K-1,y:y+K-1);BLOCK1=dct2(BLOCK1);BLOCK2=dct2(BLOCK2);a=BLOCK2(1,1)/BLOCK1(1,1)-1;ifa0W(p,q)=0;elseW(p,q)=1;endendendsubplot(2,2,4);imshow(W);title('从含水印的图像中提取的水印');G=imnoise(J1,'gaussian',0,0.01);subplot(2,3,5);imshow(G,[]);title('加入高斯噪声');w1=zeros(N,N);BLOCK3=zeros(K,K);BLOCK4=zeros(K,K);forp=1:Nforq=1:Nx=(p-1)*K+1;y=(q-1)*K+1;BLOCK3=I1(x:x+K-1,y:y+K-1);BLOCK4=G(x:x+K-1,y:y+K-1);BLOCK3=dct2(BLOCK3);BLOCK4=dct2(BLOCK4);a=BLOCK4(1,1)/BLOCK3(1,1)-1;ifa0W1(p,q)=0;elseW1(p,q)=1;endendendsubplot(2,3,6);imshow(W1);title('从含高斯噪声的水印图像中提取的水印');此程序运行后的实验结果如下图所示:这个实验结果显示也是经过自己几次对程序算法的改正才得到的正确结果,在最开始的时候虽然说可以将高斯噪声加入,但是对于显示的结果总是令人无法满意,不论是从含水印的图像中进行普通水印的提取还是从加入高斯噪声后的图像中提取水印都是无法完全提取出来,而且两个图片中所提取出来的效果也是完全一样的,但是在经过几次的算法修正后终于使得自己得到了正确的结果。
本文标题:数字水印-实验报告
链接地址:https://www.777doc.com/doc-1872951 .html