现在的位置: 首页 > 综合 > 正文

仿真代码之二

2014年02月17日 ⁄ 综合 ⁄ 共 10049字 ⁄ 字号 评论关闭

仿真的部分代码,可以参考


%designed by lilizong
% lilizong[at]gmail

                     myinforarray=linspace(0,0,5);
                     mypsnrarray=linspace(0,0,5);
                     w=1;
for myouter=1:1000      
                                A=imread('c:/boat.png');
                                [m,n]=size(A);
                                B=cell(8,8);%这里的k为你要分成大小为k*k的块
                                AA=A;
                    myinfor=0;
                    for myinter=1:3

                                                    for i=1:256/8
                                                         for j=1:256/8
                                                             B{i,j}=A((i-1)*8+1:i*8,(j-1)*8+1:j*8);
                                                         end
                                                    end

                                                    %将B化为一维
                                                    c=cell(8,8);
                                                    k=1;
                                                    for i=1:256/8
                                                        for j=1:256/8
                                                        c{k}=B{i,j};
                                                        k=k+1;
                                                        end
                                                    end

                                                    %下面的代码用于生成混沌序列,生成1024个数字,然后排序,取前512个,
                                                    %得到一个位于1-1024之间的无重复值的混沌序列

                                                    x=linspace(0,0,1024);

                                                    x(1)=0.8+myinter/10+myouter/10000;
                                                    t=linspace(0,0,1024);
                                                    m=0;
                                                    n=0;
                                                    for i=1:1023
                                                        x(i+1)=1-2*x(i)*x(i);
                                                        k=k+1;
                                                    end

                                                    [pm,pn]=sort(x);
                                                    %n为排序后结果,用的时候可以取前512个结果

                                                    tod=cell(8,8);
                                                    %定义toa为被混沌序列选中,需要处理的图像块为前512块
                                                    for  i=1:1024
                                                       tod{i}=c{pn(i)};

                                                    test=tod;    %添加一个测试块,看看问题出现在什么地方
                                                    end

                                                    %temp=cell(8,8);
                                                    %得到像素值数组xiang
                                                    xiangsu=linspace(0,0,256);
                                                    %对取得的图像快进行分析,找到最大像素值
                                                    for m=1:512
                                                        temp=tod{i};
                                                     %   temp=cell2mat(temp);
                                                        for i=1:8
                                                            for j=1:8
                                                                for  n=1:256
                                                                    if temp(i,j)==n
                                                                       xiangsu(n)=xiangsu(n)+1;
                                                                    end
                                                                end
                                                            end
                                                        end
                                                    end
                                                    %求出最大像素的值
                                                    maxxiangsu=xiangsu(1);
                                                    for i=1:256
                                                        if maxxiangsu<xiangsu(i)
                                                            maxxiangsu=xiangsu(i);
                                                            maxvalueofxiangsu=i;
                                                        end
                                                    end

                                                    %开始对需要嵌入信息的图像快进行一位处理
                                                    for m=1:512  %表示需要处理的块数
                                                        temp=tod{m};
                                                        for i=1:8
                                                            for j=1:8
                                                                if temp(i,j)<maxvalueofxiangsu
                                                                  %temp(i,j)=maxvalueofxiangsu-1;             
                                                                    temp(i,j)=temp(i,j)-1;             
                                                                end
                                                            end

                                                        end
                                                        %tod{m}=mat2cell(temp);  更改4.28
                                                        tod{m}=temp;
                                                    end

                                                    %处理完毕,开始嵌入水印

                                                    %读入水印信息

                                                    b=imread('c:/watermark.png');
                                                    [p,q]=size(b);
                                                    oo=p*q;  %用来标识水印的总像素数
                                                    watermark=reshape(b,1,oo);

                                                    %嵌入方式为,找到最高位,如果水印为0,不发生变化,如果水印为1,最高位减1
                                                    %令tt为嵌入水印循环量,如果t的值超过水印的信息量,则开始进行新的循环。
                                                    t=1;             %用来标识嵌入位
                                                    infor=0;         %用来标识总共可以嵌入的信息
                                                    for m=1:512
                                                       % temp=cell2mat(toa{m});
                                                        temp=tod{m};
                                                        for i=1:8
                                                            for j=1:8
                                                                if temp(i,j)==maxvalueofxiangsu
                                                                    if watermark(t)==1   %水印的信息如果是1,则进行原信息的改变
                                                                       temp(i,j)=temp(i,j)-1;  %此处测试一下
                                                                      %  temp(i,j)=256;
                                                                        t=t+1;
                                                                        if(t>oo)
                                                                             t=0;
                                                                        end
                                                                       
                                                                    end
                                                                    infor=infor+1;
                                                                end
                                                            end
                                                        end
                                                        %tod{m}=mat2cell(temp);
                                                        tod{m}=temp;
                                                    end
                                                    myinfor=myinfor+infor;

                                                    %对图像进行拼接
                                                    toad=cell(8,8);
                                                    for i=1:1024
                                                        toad{pn(i)}=tod{i};
                                                    end
                                                    k=1;
                                                    toyuan=cell(8,8);
                                                    for i=1:32
                                                        for j=1:32
                                                            toyuan{i,j}=toad{k};
                                                            k=k+1;
                                                        end
                                                    end

                                                    toyuan=cell2mat(toyuan);

                                                                  

                                                   % figure,imshow(toyuan);
                                                   %  此处请屏蔽外层循环后开启!!!!!
                                                    A=toyuan;
                                                
                                                 
                                                 
                                                 
                    end
                     x=AA;
                     x1=toyuan;
                     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 ;
                     myinforarray(w)=myinfor;
                     mypsnrarray(w)=uint8(g);
                     w=w+1;
                   

end

figure,plot(myinforarray);
figure,plot(mypsnrarray);

抱歉!评论已关闭.