水印代码

  • 格式:doc
  • 大小:64.50 KB
  • 文档页数:14

clear all;%logistic序列生成算法figure(1);an=linspace(3.1,3.99,400);hold on;box on;axis([min(an),max(an),-1,2]);N=64*64;xn=zeros(1,N);for a=an;x=rand;for k=1:20;x=a*x*(1-x);endfor k=1:N;x=a*x*(1-x);xn(k)=x;b(k,1)=x;endplot(a*ones(1,N),xn,'k.','markersize',1);endc=reshape(b,64,64);%二维矩阵调制for a1=1:64;for a2=1:64;if c(a1,a2)>=0.5;d(a1,a2)=1;else d(a1,a2)=0;end;end;end%水印加密e=imread('c:\new\123.BMP');e=double(e);f=bitxor(d,e);%mm=imread('c:\new\0.BMP');nn=double(mm);%h=bitxor(d,mm); g=bitxor(d,f);figure(2);subplot(2,2,1);imshow(d);title('混沌序列矩阵');subplot(2,2,2);imshow(e);title('水印图像');subplot(2,2,3);imshow(f);title('混沌加密水印图像');imwrite(f,'c:\new\0.BMP');subplot(2,2,4);imshow(g);title('水印图像恢复');M=256;N=64;[filename1,pathname]=uigetfile('*.*','select the image');image1=imread(num2str(filename1));figure(3);subplot(2,2,1);imshow(image1);title('original image');image1=double(image1);subplot(2,2,2);imshow(f);title('original watermark');%嵌入水印[ca,ch,cv,cd] = dwt2(image1,'db1');[cas,chs,cvs,cds] = dwt2(ca,'db1');for i=1:Nfor j=1:Nif f(i,j)==0a=-1;else a=1;endCa(i,j)=cas(i,j)*(1+a*0.03);endendIM= idwt2(Ca,chs,cvs,cds,'db1')markedimage=double(idwt2(IM,ch,cv,cd,'db1'));subplot(2,2,3);colormap(gray(256));image(markedimage);title('marked image');imwrite(markedimage,gray(256),'c:\new\watermarked.bmp','bmp');%提取水印image1=imread(num2str(filename1));image1=double(image1); imaged=imread('c:\new\watermarked.bmp');[ca,ch,cv,cd] = dwt2(image1,'db1');[cas,chs,cvs,cds]=dwt2(ca,'db1');[caa,chh,cvv,cdd]=dwt2(imaged,'db1');[caas,chhs,cvvs,cdds]=dwt2(caa,'db1');for p=1:Nfor q=1:Na=caas(p,q)/cas(p,q)-1;if a<0W(p,q)=0;elseW(p,q)=255;end%频谱pic1= imread('c:\new\3.jpg');%pic=rgb2gray(pic);subplot(2,2,1);imshow(pic1);title('原图');pic_fft1=fft2(double(pic1));pic_fft1=fftshift(pic_fft1);subplot(2,2,2);imshow(log(abs(pic_fft1)),[]);title('原图频谱图');endendsubplot(2,2,4);colormap(gray(256));image(W);title('从含水印图像中提取的水印'); imwrite(W,gray(256),'watermark.bmp','bmp');%figure(4);h=bitxor(d,W);figure(7);subplot(2,2,1);imshow(h);pic2= imread('c:\new\watermarked.BMP');%pic=rgb2gray(pic);subplot(2,2,3);imshow(pic2);title('新图');pic_fft2=fft2(double(pic2));pic_fft2=fftshift(pic_fft2);subplot(2,2,4);imshow(log(abs(pic_fft2)),[]);title('新图频谱图'%DWT水印源码%嵌入源码clcclear all;% 保存开始时间start_time=cputime;iTimes=20; %置乱次数k=20;blocksize=8; % 设置块的大小filter_m=[ 1,1,1,1,1,1,1,1; % 滤波矩阵1,1,1,1,1,1,1,1;1,1,0,0,0,0,1,1;1,1,0,0,0,0,1,1;1,1,0,0,0,0,1,1;1,1,0,0,0,0,1,1;1,1,1,1,1,1,1,1;1,1,1,1,1,1,1,1 ];% 读入原图像file_name='_lena_std_bw.bmp';cover_object=double(imread(file_name));% 原图像的行数与列数Mc=size(cover_object,1); %原图像行数Nc=size(cover_object,2); %原图像列数% 最大嵌入信息量max_message=Mc*Nc/(blocksize^2);% 读入水印图像file_name='c.bmp';message=double(imread(file_name));%%水印图像的行数与列数Mm=size(message,1); %水印行数Nm=size(message,2); %水印列数% 检查水印信息是否过大if (Mm*Nm> max_message)error('水印太大')end%对水印图像进行arnold置乱if Mm~=Nmerror('水印矩阵必须为方阵');endif Mm~=40error('必须为40*40大小,或者修改置乱次数'); endtempImg=message;for n=1:iTimes % 次数for u=1:Mmfor v=1:Nmtemp=tempImg(u,v);ax=mod((u-1)+(v-1),Mm)+1;ay=mod((u-1)+2*(v-1),Nm)+1;outImg(ax,ay)=temp;endendtempImg=outImg;endmessage_vector=reshape(tempImg,1,Mm*Nm);% 产生watermarked_image,并写入原图信息watermarked_image=cover_object;%置随机数发生器的状态为1100key=1100;rand('state',key);% 产生伪随机序列pn_sequence_zero=round(2*(rand(1,sum(sum(filter_m)))-0.5)); pn_sequence_one=round(2*(rand(1,sum(sum(filter_m)))-0.5)); % 将图像分块嵌入% 当(2,2) > (2,3) 且message_pad(kk)=0% 当(2,2) < (2,3) 且message_pad(kk)=1%%经过分析可以得出结论:在提取水印时,如果cD1(2,2)>cD1(2,3)便是嵌入了水印的黑色像素,%%反之则是嵌入了白色像素x=1;y=1;h=waitbar(0,'嵌入水印,请等待');for (kk = 1:length(message_vector))% 对块进行DWT变换[cA1,cH1,cV1,cD1] =dwt2(cover_object(x:x+blocksize-1,y:y+blocksize-1),'haar');a=cD1;% 如果message_pad(kk)== 0if (message_vector(kk) == 0)% 且(2,2) < (2,3) ,交换它们if (cD1(2,2) < cD1(2,3))temp=cD1(2,3);cD1(2,3)=cD1(2,2);cD1(2,2)=temp;end% 如果message_pad(kk) == 1, elseif (message_vector(kk) == 1)% 且(2,2) > (2,3) ,交换它们if (cD1(2,2) >= cD1(2,3))temp=cD1(2,3);cD1(2,3)=cD1(2,2);cD1(2,2)=temp;endend% 检查(2,2) ,(2,3)的差是否>= k if cD1(2,2) > cD1(2,3)if cD1(2,2) - cD1(2,3) < kcD1(2,2)=cD1(2,2)+(k/2);cD1(2,3)=cD1(2,3)-(k/2);endelseif cD1(2,3) - cD1(2,2) < kcD1(2,3)=cD1(2,3)+(k/2);cD1(2,2)=cD1(2,2)-(k/2);endend%IDWTwatermarked_image(x:x+blocksize-1,y:y+blocksize-1)=idwt2(cA1,cH1,cV1,cD1,'haar',[Mc,Nc]);% 移动到下一块if (x+blocksize) >= Ncx=1;y=y+blocksize;elsex=x+blocksize;endwaitbar(kk/length(message_vector),h);endclose(h);% 转换为uint8并写入dwt_watermarked.bmpwatermarked_image_uint=uint8(watermarked_image);imwrite(watermarked_image_uint,'dwt_watermarked.bmp','bmp'); % 显示运行时间elapsed_time=cputime-start_time,% 显示图像figure(1)subplot(2,2,1);imshow(message,[]);title('水印');subplot(2,2,4)imshow(outImg,[]);title('置乱水印');subplot(2,2,2);imshow(cover_object,[]);title('原图');subplot(2,2,3);imshow(watermarked_image,[]) title('嵌入水印图像')%DWT源码%提取源码clear all;% 保存开始时间start_time=cputime;iTimes=20; %置乱次数blocksize=8; % 设置块的大小filter_m=[ 1,1,1,1,1,1,1,1; % 滤波矩阵1,1,1,1,1,1,1,1;1,1,0,0,0,0,1,1;1,1,0,0,0,0,1,1;1,1,0,0,0,0,1,1;1,1,0,0,0,0,1,1;1,1,1,1,1,1,1,1;1,1,1,1,1,1,1,1 ];% 读入嵌入水印图像[filename,pathname]=uigetfile('*.bmp;*tiff;*tif;*jpg','输入嵌有水印的图像'); watermarked_image=double(imread(filename));% 嵌入水印图像的行数与列数Mw=size(watermarked_image,1); %嵌入水印图像的行数Nw=size(watermarked_image,2); %嵌入水印图像的列数% 最大嵌入信息量max_message=Mw*Nw/(blocksize^2);% 读入原始水印file_name='c.bmp';orig_watermark=double(imread(file_name));% 原始水印的行数与列数Mo=size(orig_watermark,1); %原始水印的行数No=size(orig_watermark,2); %原始水印的列数%置随机数发生器的状态为1100rand('state',1100);% 产生伪随机序列pn_sequence_zero=round(2*(rand(1,sum(sum(filter_m)))-0.5));pn_sequence_one=round(2*(rand(1,sum(sum(filter_m)))-0.5));% 将图像分块提取水印x=1;y=1;h=waitbar(0,'水印提取中,请等待');for (kk = 1:max_message)% 对块进行dwt变换[cA1,cH1,cV1,cD1] =dwt2(watermarked_image(x:x+blocksize-1,y:y+blocksize-1),'haar');% 如果cD1(2,2) > cD1(3,3) 那么message_vector(kk)=0% 否则message_vector(kk)=1if cD1(2,2)>cD1(3,3)message_vector(kk)=0;elsemessage_vector(kk)=1;end% 移动到下一块if (x+blocksize) >= Mwx=1;y=y+blocksize;elsex=x+blocksize;endwaitbar(kk/max_message,h);endclose(h);% arnold置乱tempImg=reshape(message_vector(1:Mo*No),Mo,No); message_arnold=tempImg;for n=1:iTimes % 次数for u=1:Mofor v=1:Notemp=tempImg(u,v);ax=mod((u-1)+(v-1),Mo)+1;ay=mod((u-1)+2*(v-1),No)+1;outImg(ax,ay)=temp;endendtempImg=outImg;endmessage=tempImg;% 计算运行时间elapsed_time=cputime-start_time, % 显示提取水印与原始水印figure(3)subplot(1,3,1);imshow(message_arnold,[]);title('提取的置乱水印');subplot(1,3,2);imshow(message,[]);title('再次置乱后水印');subplot(1,3,3);imshow(orig_watermark,[])title('原始水印');。