% a原始数据数组 % aa存储像素从1到255 % bb存储aa中每个像素所对应的个数 % cc将a化成一列后,所形成的数组 % dd,cc中小于最大个数的像素值,减1处理后的结果 % copyright by lilizong a=imread('c:oat.png'); figure,imshow(a),title('嵌入水印前原图像'); for i=1:255 aa(i)=i; %用于存储像素值 end for i=1:255 bb(i)=0; %用于存储每个像素的个数 end [m,n]=size(a); k=m*n; %a的大小 cc=a(:); tt=1; %循环遍历向量 %求出某个像素的个数 for i=1:k for j=1:255 if(cc(i)==aa(j)) bb(j)=bb(j)+1; end end end % 求出哪个像素的个数是最大 max=bb(1); for i=1:255 if(bb(i)>max) max=bb(i); maxi=i; end end % 将所有小于max的像素的值都减1 ddd=zeros(m,n); dd=ddd(:); %产生和cc同样大小的数组,用于存放cc处理后结果; for i=1:k if(cc(i)<max) dd(i)=cc(i)-1; end end %读入水印,并将水印转换成一列, watermark=imread('c:watermark1.png'); figure,imshow(watermark),title('水印图像'); [w1,w2]=size(watermark); watermark_line=watermark(:); oo=w1*w2; %开始嵌入水印 tt=1; %让tt加1来遍历整个水印图像 for i=1:k if(dd(i)==max) if(tt>oo) tt=1; %如果超出水印的范围从头开始 if(watermark_line(tt)==1) dd(i)=dd(i)-1; end end tt=tt+1; end end %显示嵌入水印的图像 embed=dd; embed=reshape(dd,m,n); figure,imshow(embed,[]),title('嵌入水印后图像'); imwrite(embed,'c:embed2.gif'); %提取水印 for i=1:k if(dd(i)==max) watermark(tt)=0; tt=tt+1; elseif(dd(i)==(max-1)) watermark(tt)=1; tt=tt+1; end 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(dd(i)==(max-1)) dd(i)=dd(i)+1; elseif(dd(i)<max) dd(i)=dd(i)+1; end end dd=reshape(dd,m,n); figure,imshow(dd,[]),title('恢复后图像'); %对原图和恢复图像进行比较