部分仿真代码,供参考 %designedbylilizong%lilizong[at]gmaila=imread('c:bbb.png');%读入图像figure,imshow(a),title('原图像');%显示图像figure,imhist(a);b=a(:);[m,n]=size(a);k=size(b);%下述操作可以实现像素的显示c=linspace(0,0,256);fori=1:kforj=1:256if(b(i)==j)c(j)=c(j)+1;endendend%以下步骤简单实现读取整个图像的峰值点max=c(1);maxi=0;fori=1:256if(c(i)>max)max=c(i);maxi=i;endendmaxmaxi%下面步骤实现对各个峰值的读取d=c;%作为临时操作数组,以不破坏原数组emax=linspace(0,0,256);emaxi=linspace(0,0,256);a=1;forj=2:256if(d(j)>d(j-1)&d(j)>d(j+1)&d(j)~=8888)emax(a)=d(j);emaxi(a)=j;d(j)=8888;a=a+1;%开始没有想明白,用额外的循环变量endend%下面的程序读取四个高峰值,并进行显示fmax=linspace(0,0,10);fmaxi=linspace(0,0,10);bnum=1;fori=1:10fmax(bnum)=emax(1);forj=2:256if(emax(j)>fmax(bnum))fmax(bnum)=emax(j);fmaxi(bnum)=emaxi(j);t=j;endendemax(t)=0;bnum=bnum+1;endfori=1:10fmax(i)fmaxi(i)end%至此峰值已经提出出来了%在第一个峰值嵌入水印%首先把小于最大的像素值的都减去2cc=zeros(m,n);c=cc(:);fori=1:kif(b(i)<fmax(1))c(i)=b(i)-2;endendwatermark=imread('c:watermark.png');figure,imshow(watermark);[w1,w2]=size(watermark);watermark_line=watermark(:);oo=w1*w2;%开始嵌入水印%第一次水印tt=1;%让tt加1来遍历整个水印图像fori=1:kif(c(i)==fmax(1))if(tt>oo)tt=1;%如果超出水印的范围从头开始if(watermark_line(tt)==1)c(i)=c(i)-1;endendtt=tt+1;endend%第二次水印tt=1;%让tt加1来遍历整个水印图像fori=1:kif(c(i)==fmax(2))if(tt>oo)tt=1;%如果超出水印的范围从头开始if(watermark_line(tt)==1)c(i)=c(i)-2;endendtt=tt+1;elseif(c(i)==fmax(2)+1)if(tt>oo)tt=1;if(watermar_line(tt)==1)c(i)=c(i)-2;endendendend%显示嵌入水印的图像embed=c;embed=reshape(c,m,n);figure,imshow(embed,[]),title('嵌入水印的图像');%提取水印%提取第一层fori=1:kif(c(i)==fmax(2))watermark(tt)=0;%tt=tt+1;%elseif(c(i)==(fmax(1)+1))%watermark(tt)=0;%tt=tt+1;%elseif(c(i)=fmax(1)-1)%elseif(c(i)=fmax(1)-1)%watermark(tt)=1;%tt=tt+1;%elseif(c(i)=fmax(1)-2)%watermark(tt)=1;%tt=tt+1;%endelseif(c(i)==fmax(2)+1)watermark(tt)=0;elseif(c(i)==fmax(2)-1)watermark(tt)=1;elseif(c(i)==fmax(2)-2)watermark=1;endendendtt=tt+1;endend%提取第二层fori=1:kif(c(i)==fmax(1))watermark(tt)=0;tt=tt+1;elseif(c(i)==(fmax(1)-1))watermark(tt)=1;tt=tt+1;endendfori=1:oowatermark_dect(i)=watermark(i);endfori=1:oowatermark_dect(i)=watermark(i);endwatermark_dect=reshape(watermark_dect,w1,w2);figure,imshow(watermark_dect,[]),title('提取出来的水印');%恢复原图像dd=embed(:);fori=1:kif(c(i)==(max-2))c(i)=c(i)+2;elseif(c(i)<max-2)c(i)=c(i)+2;endenddd=reshape(c,m,n);figure,imshow(dd,[]),title('恢复的图像');a=imread('c:bbb.png');x=a;x1=embed;x=double(x);x1=double(x1);fori=1:256;forj=1:256;MYa(i,j)=x(i,j)^2;%afterfiltering'ssingleMYb(i,j)=x(i,j)-x1(i,j);endendd=0;e=0;fori=1:256;forj=1:256;d=d+MYa(i,j);e=e+MYb(i,j)*MYb(i,j);endendf=log10(d/e);g=10*f