下面是上述仿真的部分代码,供参考。
%a原始数据数组
%aa存储像素从1到255
%bb存储aa中每个像素所对应的个数
%cc将a化成一列后,所形成的数组
%dd,cc中小于最大个数的像素值,减1处理后的结果
%copyrightbylilizong
a=imread('c:oat.png');
figure,imshow(a),title('嵌入水印前原图像');
fori=1:255
aa(i)=i;%用于存储像素值
end
fori=1:255
bb(i)=0;%用于存储每个像素的个数
end
[m,n]=size(a);
k=m*n;%a的大小
cc=a(:);
tt=1;%循环遍历向量
%求出某个像素的个数
fori=1:k
forj=1:255
if(cc(i)==aa(j))
bb(j)=bb(j)+1;
end
end
end
%求出哪个像素的个数是最大
max=bb(1);
fori=1:255
if(bb(i)>max)
max=bb(i);
maxi=i;
end
end
%将所有小于max的像素的值都减1
ddd=zeros(m,n);
dd=ddd(:);%产生和cc同样大小的数组,用于存放cc处理后结果;
fori=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来遍历整个水印图像
fori=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');
%提取水印
fori=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
fori=1:oo
watermark_dect(i)=watermark(i);
end
watermark_dect=reshape(watermark_dect,w1,w2);
figure,imshow(watermark_dect,[]),title('提取后水印');
%恢复原图像
dd=embed(:);
fori=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('恢复后图像');

%对原图和恢复图像进行比较







图像水印嵌入与提取
383

被折叠的 条评论
为什么被折叠?



