仿真代码之三

来源:互联网 发布:php图形验证码接口 编辑:程序博客网 时间:2024/04/30 02:18

 
部分仿真代码,供参考






%designed by lilizong
%lilizong[at]gmail


a
=imread('c:bbb.png');   % 读入图像
figure,imshow(a),title(
'原图像');  %显示图像
figure,imhist(a);
b
=a(:);
[m,n]
=size(a);
k
=size(b);
%  下述操作可以实现像素的显示
c
=linspace(0,0,256);
for i=1:k
    
for j=1:256
        
if(b(i)==j)
            c(j)
=c(j)+1;
        end
    end
end
%  以下步骤简单实现读取整个图像的峰值点

max
=c(1);
maxi
=0;
for i=1:256
    
if(c(i)>max)
        max
=c(i);
        maxi
=i;
    end
end
max
maxi




%  下面步骤实现对各个峰值的读取
d
=c;  %作为临时操作数组,以不破坏原数组
emax
=linspace(0,0,256);
emaxi
=linspace(0,0,256);
a
=1;
for j=2:256
    
if(d(j)>d(j-1&d(j)>d(j+1&d(j)~=8888)
        emax(a)
=d(j);
        emaxi(a)
=j;
        d(j)
=8888;
        a
=a+1;   %开始没有想明白,用额外的循环变量
    end
end


%  下面的程序读取四个高峰值,并进行显示
fmax
=linspace(0,0,10);
fmaxi
=linspace(0,0,10);
bnum
=1;
for i=1:10
    fmax(bnum)
=emax(1);
    
for j=2:256
        
if(emax(j)>fmax(bnum))
            fmax(bnum)
=emax(j);
            fmaxi(bnum)
=emaxi(j);
            t
=j;
        end
    end
    emax(t)
=0;
    bnum
=bnum+1;
end


for i=1:10
    fmax(i)
    fmaxi(i)
end

%  至此峰值已经提出出来了







%在第一个峰值嵌入水印
%  首先把小于最大的像素值的都减去2
cc
=zeros(m,n);
c
=cc(:);

for i=1:k
    
if(b(i)<fmax(1))
        c(i)
=b(i)-2;
    end
end

watermark
=imread('c:watermark.png');
figure,imshow(watermark);
[w1,w2]
=size(watermark);
watermark_line
=watermark(:);
oo
=w1*w2;

%开始嵌入水印

%第一次水印

tt
=1;  %让tt加1来遍历整个水印图像
for i=1:k
    
if(c(i)==fmax(1))
        
if(tt>oo)
            tt
=1;  %如果超出水印的范围从头开始
            
if(watermark_line(tt)==1)
                c(i)
=c(i)-1;
            end

        end
        tt
=tt+1;
    end
end



%第二次水印
tt
=1;  %让tt加1来遍历整个水印图像
for i=1:k
    
if(c(i)==fmax(2))
        
if(tt>oo)
            tt
=1;  %如果超出水印的范围从头开始
            
if(watermark_line(tt)==1)
                c(i)
=c(i)-2;
            end
        end
        tt
=tt+1;
    elseif(c(i)
==fmax(2)+1)
        
if(tt>oo)
            tt
=1;
            
if(watermar_line(tt)==1)
                c(i)
=c(i)-2;
            end
        end
    end
end









%显示嵌入水印的图像


embed
=c;
embed
=reshape(c,m,n);
figure,imshow(embed,[]),title(
'嵌入水印的图像');


%提取水印

%提取第一层

for i=1:k
    
if(c(i)==fmax(2))
        watermark(tt)
=0;
        
%  tt=tt+1;
        
%elseif(c(i)==(fmax(1)+1))
        
%   watermark(tt)=0;
        
%  tt=tt+1;
        
%elseif(c(i)=fmax(1)-1)
        
%    elseif(c(i)=fmax(1)-1)
        
%       watermark(tt)=1;
        
%      tt=tt+1;
        
% elseif(c(i)=fmax(1)-2)
        
%    watermark(tt)=1;
        
%   tt=tt+1;
        
%end
    
else
        
if(c(i)==fmax(2)+1)
            watermark(tt)
=0;
        
else
            
if(c(i)==fmax(2)-1)
                watermark(tt)
=1;
            
else
                
if(c(i)==fmax(2)-2)
                    watermark
=1;
                end
            end
        end
        tt
=tt+1;
    end
end


%提取第二层


for i=1:k
    
if(c(i)==fmax(1))
        watermark(tt)
=0;
        tt
=tt+1;
    elseif(c(i)
==(fmax(1)-1))
        watermark(tt)
=1;
        tt
=tt+1;
    end
end
for i=1:oo
    watermark_dect(i)
=watermark(i);
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(c(i)==(max-2))
        c(i)
=c(i)+2;
    elseif(c(i)
<max-2)
        c(i)
=c(i)+2;
    end
end
dd
=reshape(c,m,n);
figure,imshow(dd,[]),title(
'恢复的图像');



a
=imread('c:bbb.png');

x
=a;
x1
=embed;
x
=double(x);
x1
=double(x1);
for i=1:256;
    
for j=1:256;
        MYa(i,j)
=x(i,j)^2;  %after filtering's single
        MYb(i,j)=x(i,j)-x1(i,j);
    end
end
d
=0;
e
=0;
for i=1:256;
    
for j=1:256;
        d
=d+MYa(i,j);
        e
=e+MYb(i,j)*MYb(i,j);
    end
end
f
=log10(d/e);
g
=10*f