部分源代码

来源:互联网 发布:食品安全数据 编辑:程序博客网 时间:2024/05/01 20:46


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

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


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