%designed by lilizong %lilizong[at]gmail a=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); for i=1:k for j=1:256 if(b(i)==j) c(j)=c(j)+1; end end end % 以下步骤简单实现读取整个图像的峰值点 max=c(1); maxi=0; for i=1:256 if(c(i)>max) max=c(i); maxi=i; end end max maxi % 下面步骤实现对各个峰值的读取 d=c; %作为临时操作数组,以不破坏原数组 emax=linspace(0,0,256); emaxi=linspace(0,0,256); a=1; for j=2:256 if(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; %开始没有想明白,用额外的循环变量 end end % 下面的程序读取四个高峰值,并进行显示 fmax=linspace(0,0,10); fmaxi=linspace(0,0,10); bnum=1; for i=1:10 fmax(bnum)=emax(1); for j=2:256 if(emax(j)>fmax(bnum)) fmax(bnum)=emax(j); fmaxi(bnum)=emaxi(j); t=j; end end emax(t)=0; bnum=bnum+1; end for i=1:10 fmax(i) fmaxi(i) end % 至此峰值已经提出出来了 %在第一个峰值嵌入水印 % 首先把小于最大的像素值的都减去2 cc=zeros(m,n); c=cc(:); for i=1:k if(b(i)<fmax(1)) c(i)=b(i)-2; end end watermark=imread('c:watermark.png'); figure,imshow(watermark); [w1,w2]=size(watermark); watermark_line=watermark(:); oo=w1*w2; %开始嵌入水印 %第一次水印 tt=1; %让tt加1来遍历整个水印图像 for i=1:k if(c(i)==fmax(1)) if(tt>oo) tt=1; %如果超出水印的范围从头开始 if(watermark_line(tt)==1) c(i)=c(i)-1; end end tt=tt+1; end end %第二次水印 tt=1; %让tt加1来遍历整个水印图像 for i=1:k if(c(i)==fmax(2)) if(tt>oo) tt=1; %如果超出水印的范围从头开始 if(watermark_line(tt)==1) c(i)=c(i)-2; end end tt=tt+1; elseif(c(i)==fmax(2)+1) if(tt>oo) tt=1; if(watermar_line(tt)==1) c(i)=c(i)-2; end end end end %显示嵌入水印的图像 embed=c; embed=reshape(c,m,n); figure,imshow(embed,[]),title('嵌入水印的图像'); %提取水印 %提取第一层 for i=1:k if(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; %end else if(c(i)==fmax(2)+1) watermark(tt)=0; else if(c(i)==fmax(2)-1) watermark(tt)=1; else if(c(i)==fmax(2)-2) watermark=1; end end end tt=tt+1; end end %提取第二层 for i=1:k if(c(i)==fmax(1)) watermark(tt)=0; tt=tt+1; elseif(c(i)==(fmax(1)-1)) watermark(tt)=1; tt=tt+1; end end for i=1:oo watermark_dect(i)=watermark(i); end for i=1:oo watermark_dect(i)=watermark(i); end watermark_dect=reshape(watermark_dect,w1,w2); figure,imshow(watermark_dect,[]),title('提取出来的水印'); %恢复原图像 dd=embed(:); for i=1:k if(c(i)==(max-2)) c(i)=c(i)+2; elseif(c(i)<max-2) c(i)=c(i)+2; end end dd=reshape(c,m,n); figure,imshow(dd,[]),title('恢复的图像'); a=imread('c:bbb.png'); x=a; x1=embed; x=double(x); x1=double(x1); for i=1:256; for j=1:256; MYa(i,j)=x(i,j)^2; %after filtering's single MYb(i,j)=x(i,j)-x1(i,j); end end d=0; e=0; for i=1:256; for j=1:256; d=d+MYa(i,j); e=e+MYb(i,j)*MYb(i,j); end end f=log10(d/e); g=10*f