部分源代码



下面是上述仿真的部分代码,供参考。

%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(
'恢复后图像');


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








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值