下面是上述仿真的部分代码,供参考。 %a原始数据数组%aa存储像素从1到255%bb存储aa中每个像素所对应的个数%cc将a化成一列后,所形成的数组%dd,cc中小于最大个数的像素值,减1处理后的结果%copyrightbylilizonga=imread('c:oat.png');figure,imshow(a),title('嵌入水印前原图像');fori=1:255aa(i)=i;%用于存储像素值endfori=1:255bb(i)=0;%用于存储每个像素的个数end[m,n]=size(a);k=m*n;%a的大小cc=a(:);tt=1;%循环遍历向量%求出某个像素的个数fori=1:kforj=1:255if(cc(i)==aa(j))bb(j)=bb(j)+1;endendend%求出哪个像素的个数是最大max=bb(1);fori=1:255if(bb(i)>max)max=bb(i);maxi=i;endend%将所有小于max的像素的值都减1ddd=zeros(m,n);dd=ddd(:);%产生和cc同样大小的数组,用于存放cc处理后结果;fori=1:kif(cc(i)<max)dd(i)=cc(i)-1;endend%读入水印,并将水印转换成一列,watermark=imread('c:watermark1.png');figure,imshow(watermark),title('水印图像');[w1,w2]=size(watermark);watermark_line=watermark(:);oo=w1*w2;%开始嵌入水印tt=1;%让tt加1来遍历整个水印图像fori=1:kif(dd(i)==max)if(tt>oo)tt=1;%如果超出水印的范围从头开始if(watermark_line(tt)==1)dd(i)=dd(i)-1;endendtt=tt+1;endend%显示嵌入水印的图像embed=dd;embed=reshape(dd,m,n);figure,imshow(embed,[]),title('嵌入水印后图像');imwrite(embed,'c:embed2.gif');%提取水印fori=1:kif(dd(i)==max)watermark(tt)=0;tt=tt+1;elseif(dd(i)==(max-1))watermark(tt)=1;tt=tt+1;endendfori=1:oowatermark_dect(i)=watermark(i);endwatermark_dect=reshape(watermark_dect,w1,w2);figure,imshow(watermark_dect,[]),title('提取后水印');%恢复原图像dd=embed(:);fori=1:kif(dd(i)==(max-1))dd(i)=dd(i)+1;elseif(dd(i)<max)dd(i)=dd(i)+1;endenddd=reshape(dd,m,n);figure,imshow(dd,[]),title('恢复后图像');%对原图和恢复图像进行比较