Chinaunix首页 | 论坛 | 博客
  • 博客访问: 24741
  • 博文数量: 11
  • 博客积分: 520
  • 博客等级: 中士
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-16 21:26
文章分类
文章存档

2010年(1)

2007年(10)

我的朋友

分类:

2007-05-07 15:54:39

图像置乱程序及混沌系统程序

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

1 混沌系统

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
混沌系统具有对初始条件或者系统参数敏感的特性。当系统参数选取不同的值时,
系统能够表现出倍周期分叉(Bifurcation diagram) 和混沌 (Chaos) 等复杂现象。
下面主要介绍一下用三阶微分方程表示的连续混沌系统。
(1)Lorenz 系统
dx/dt=a*(y-x)
dy/dt=b*x-y-x*z
dz/dt=x*y-c*z
其中a,b,c是系统参数。当a=10, b=28, c=8/3 时,Lorenz 系统是混沌的。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear
tic;h=0.01;
x=zeros(1,10001);x(1)=1;
y=zeros(1,10001);y(1)=1;
z=zeros(1,10001);z(1)=1;
for r=1:10000
    x(r+1)=x(r)+h*(10*(y(r)-x(r)));
    y(r+1)=y(r)+h*(-x(r)*z(r)+28*x(r)-y(r));
    z(r+1)=z(r)+h*(x(r)*y(r)-8/3*z(r));
end
t=toc;disp([Time for run is:,num2str(t)]);
plot(x,y,k.,marker,.,markersize,1)
title(洛伦兹方程)
print(-dbmp,洛伦兹方程时间序列)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
(2) Chen 系统
dx/dt=a*(y-x)
dy/dt=(c-a)*x+c*y-x*z
dz/dt=x*y-b*z
其中a,b,c是系统参数。当a=35, b=3, c=28 时系统是混沌的。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear
tic;h=0.0001;a=35;b=3;c=28;
x=zeros(1,100001);%x(1)=1;
y=zeros(1,100001);y(1)=1;
z=zeros(1,100001);%z(1)=1;
for r=1:100000
    x(r+1)=x(r)+h*a*(y(r)-x(r));
    y(r+1)=y(r)+h*((c-a)*x(r)+c*y(r)-x(r)*z(r));
    z(r+1)=z(r)+h*(x(r)*y(r)-b*z(r));
end
t=toc;disp([Time for run is:,num2str(t)]);
plot(x(10000:100001),y(10000:100001),k.,marker,.,markersize,1)
title(Chen 系统)
print(-dbmp,Chen 系统)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

(3)Chua 系统
dx/dt=-apha*x+apha*y-apha*f
dy/dt=x-y+z
dz/dt=beta*z
其中f=b*x+(a-b)*(|y+1|-|y-1|)/2, apha,beta,a,b是系统参数。
当参数apha=10, beta=14.87, a=-1.27, b=-0.68时,Chua系统是混沌的。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear
tic;h=0.0001;apha=10;beta=14.87;a=-1.27;b=-0.68;
x=zeros(1,10001);x(1)=1;
y=zeros(1,10001);y(1)=1;
z=zeros(1,10001);z(1)=1;
for r=1:10000
    f(r)=b*x(r)+(a-b)*(abs(y(r)+1)-abs(y(r)-1))/2;
    x(r+1)=x(r)+h*(-apha*x(r)+apha*y(r)-apha*f(r));
    y(r+1)=y(r)+h*(x(r)-y(r)+z(r));
    z(r+1)=z(r)+h*(beta*z(r));
end
t=toc;disp([Time for run is:,num2str(t)]);
plot(x,y,k.,marker,.,markersize,1)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

(4) Rossler 系统
dx/dt=-y-z
dy/dt=x+a*y
dz/dt=c-b*z+x*z
其中a,b,c是系统参数。当a=0.2, b=5.7, c=0.2 时, Rossler 系统是混沌的。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear
tic;h=0.01;
x=zeros(1,10001);x(1)=1;
y=zeros(1,10001);y(1)=1;
z=zeros(1,10001);z(1)=1;
for r=1:10000
    x(r+1)=x(r)+h*(-y(r)-z(r));
    y(r+1)=y(r)+h*(x(r)+0.2*y(r));
    z(r+1)=z(r)+h*(0.2-5.7*z(r)+x(r)*z(r));
end
t=toc;disp([Time for run is:,num2str(t)]);
plot(x,y,k.,marker,.,markersize,1)
title(Rossler系统)
print(-dbmp, Rossler系统xz)

%%%%%%%%%%%%%%%%%四阶Rossler振荡器
clear
tic;h=0.01;
x=zeros(1,10001);x(1)=1;
y=zeros(1,10001);y(1)=1;
z=zeros(1,10001);z(1)=1;
w=zeros(1,10001);w(1)=1;
for r=1:10000
    x(r+1)=x(r)+h*(-y(r)-z(r));
    y(r+1)=y(r)+h*(x(r)+0.25*y(r)+w(r));
    z(r+1)=z(r)+h*(3+x(r)*z(r));
    w(r+1)=z(r)+h*(-0.5*z(r)+0.05*w(r));
end
t=toc;disp([Time for run is:,num2str(t)]);

plot(x,y,k.,marker,.,markersize,1)
title(Rossler振荡器)
print(-dbmp,Rossler振荡器xy)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

(5) van der Pol 振子
dx/dt=x-x^3/3-y+p+q*cos(w*t)
dy/dt=c*(x+a-b*y)
其中a,b,c,p,q,w是系统参数。当a=0.7, b=0.8, c=0.1, p=0.0, q=0.74, w=1.0 时,van der Pol 是混沌的。
除此之外,著名的连续混沌还有Duffing 振子和 Lu (吕) 系统。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear
tic;h=0.01;a=0.7;b=0.8;c=0.1;p=0.0;q=0.74;w=1.0;
x=zeros(1,10001);x(1)=1;
y=zeros(1,10001);y(1)=1;
z=zeros(1,10001);z(1)=1;
for r=1:10000
    x(r+1)=x(r)+h*(x(r)-x(r)^3/3-y(r)+p+q*cos(w*h));
    y(r+1)=y(r)+h*c*(x(r)+a-b*y(r));
end
t=toc;disp([Time for run is:,num2str(t)]);
plot(x,y,k.,marker,.,markersize,1)
title(van der Pol 振子)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
(6) Lu (吕) 系统

clear
tic;h=0.001;a=36;b=3;c=20;
x=zeros(1,100001);x(1)=1;
y=zeros(1,100001);y(1)=1;
z=zeros(1,100001);z(1)=1;
for r=1:100000
    x(r+1)=x(r)+h*a*(y(r)-x(r));
    y(r+1)=y(r)+h*(-x(r)*z(r)+c*y(r));
    z(r+1)=z(r)+h*(x(r)*y(r)-b*z(r));
end
t=toc;disp([Time for run is:,num2str(t)]);
plot3(x(10000:100001),y(10000:100001),z(10000:100001),k.,marker,.,markersize,1)
title(Lu (吕) 系统)
print(-dbmp, Lu (吕) 系统)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

2 gray变换

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%gray变换
clear
tic
T=[1,0,0,0,0,0,0,0;
   1,1,0,0,0,0,0,0;
   0,1,1,0,0,0,0,0;
   0,0,1,1,0,0,0,0;
   0,0,0,1,1,0,0,0;
   0,0,0,0,1,1,0,0;
   0,0,0,0,0,1,1,0;
   0,0,0,0,0,0,1,1];
G=zeros(1,256);
r=0:255;
g=de2bi(r,left-msb,8);
G(r+1)=[128,64,32,16,8,4,2,1]*rem(T*g(r+1,:),2);
toc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

help de2bi   %可以利用de2bi进行改进

用2进制gray进行256*256图象加密
clear
A=imread(lena.bmp);
T=[1,0,0,0,0,0,0,0;
   1,1,0,0,0,0,0,0;
   0,1,1,0,0,0,0,0;
   0,0,1,1,0,0,0,0;
   0,0,0,1,1,0,0,0;
   0,0,0,0,1,1,0,0;
   0,0,0,0,0,1,1,0;
   0,0,0,0,0,0,1,1];
for i=1:256;
    for j=1:256;
    t=double(A(i,j));
    u7=fix(t/128);
    u6=fix((t-128*u7)/64);
    u5=fix((t-128*u7-64*u6)/32);
    u4=fix((t-128*u7-64*u6-32*u5)/16);
    u3=fix((t-128*u7-64*u6-32*u5-16*u4)/8);
    u2=fix((t-128*u7-64*u6-32*u5-16*u4-8*u3)/4);
    u1=fix((t-128*u7-64*u6-32*u5-16*u4-8*u3-4*u2)/2);
    u0=t-128*u7-64*u6-32*u5-16*u4-8*u3-4*u2-2*u1;  
    u=[u7,u6,u5,u4,u3,u2,u1,u0];  

    B(i,j)=[128,64,32,16,8,4,2,1]*rem(T^2*u,2);
    end
end
imshow(uint8(B))

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

3  利用128*128幻方对图像进行加密  (骑士游加密方法与之类似)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%按顺序找出矩阵中元素的坐标:
clear
n=128;
a=magic(n);
[i,j,v]=find(a);%v为从第一列开始a中的元素,i,j为其位置坐标
i=i;
j=j;
v=v;
[E,index]=sort(v);%index为E的索引。即:index(t)个元素为E(t)
for t=1:n^2
  y1(t)=i(index(t));
  y2(t)=j(index(t));
end

A=imread(camera.gif);
[m,n]=size(A);
B=zeros(m,n);
for N=1:2
 for t=1:m^2-1;
    B(y1(t+1),y2(t+1))=A(y1(t),y2(t));
 end
    B(y1(1),y2(1))=A(y1(m^2),y2(n^2));
 A=B;
end
imshow(uint8(B));


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

4 用面包师变换对256*256图象进行1次加密

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear
A=imread(lena.bmp);
[M,N]=size(A);
for i=1:M
   for j=1:N
      if (1<=i)&(i<=M/2)&(1<=j)&(j<=N/2)
         x=2*i;
         y=2*j-1;
      elseif (1<=i)&(i<=M/2)&(N/2         x=2*i-1;
         y=2*N-2*j-2;
      elseif (M/2         x=2*i-M;
         y=2*j;
      else
         x=2*i-M-1;
         y=2*N-2*j+1;
      end
      B(257-y,x)=A(257-j,i);
   end
end
imshow(B);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

5 对图像进行SVD变换%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear
[A,map]=imread(lena.bmp);  %读取图像
%A=X(120:220,120:220);         %将图像的一部分取出,并命名为A
[nx,ny]=size(A);              %算出A矩阵的大小??
I=eye(nx,nx);                 %取一个和A同样大小的单位矩阵
for i=nx:-1:nx/4              %将单位矩阵I的部分主对角线元素设为0
  I(i,i)=0;                   %以便和A 的特征值矩阵相乘后???
end                           %消去一部分的特征值?
[u d v]=svd(double(A));               %对A矩阵进行SVD变换
B=u*I*d*v;
B=uint8(B);                   %将 A 矩阵还原回来并设为 B
subplot(221);imshow(A,map)    %将原始图像显示出来 
subplot(222);imhist(A)
subplot(223);imshow(B,map)    %将近似图像显示出来
subplot(224);imhist(B)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

6  用Arnold变换对256*256灰度图象进行n次加密

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function Arnoldtran(image,N)
A=imread(image);
[m,n]=size(A);
%tic;
for i=0:m-1
   for j=0:n-1
       Y=Arnoldtransf(i,j,N,m);
          B(m-Y(1),Y(2)+1)=A(m-i,j+1);
       end
   end
%t=toc;
%disp([Time for run is:,num2str(t)]);
subplot(121);imshow(A);title(原始图像  );
subplot(122);imshow(B);title(加密图像);
%imwrite(B,192.bmp);

function Y=Arnoldtransf(x,y,N,m)
Y=[x,y];
for k=1:N
    t=x;
    x=mod(x+y,m);
    y=mod(t+2*y,m);
end
Y=[x,y];


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

周期


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#include
void main()
{
 cout<<"求二维Arnold变换在数字图象矩阵的维数从2到点512时的周期"< for(int i=2;i<=1024;i++)
 {
 int x=i-1;
 int y=i-1;
 int j=0;
 int t;
 do
 {
  t=x;
  x=(7*x+10*y)%i;
  y=(5*t+7*y)%i;
  j=j+1;
 } 
 while((x!=(i-1))||(y!=(i-1)));
 cout< }
 
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

7  此程序为Z形扫描的逆过程,由一位好朋友提供,在此表示感谢!

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function a=izigzag(v,m,n)


a=zeros(m,n);
a(1,1)=v(1);
counter=2;
for k=3:1:m+n
    b1=bound1(k,a);
    b2=bound2(k,a);
    if mod(k,2)==1
        for p=b1:1:b2
            a(p,k-p)=v(counter);
            counter=counter+1;
        end
    else
        for p=b2:-1:b1
            a(p,k-p)=v(counter);
            counter=counter+1;
        end
    end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% inner function
function b1=bound1(k,a)
[m,n]=size(a);
for b1=1:1:m
    q=k-b1;
    if q<=n
        return
    end
end
%%%%%%%%%%%%%%%%%%%%%%
function b2=bound2(k,a)
[m,n]=size(a);
for q=1:1:n
    b2=k-q;
    if b2<=m
        return
    end
end
%%%%%%%%%%%%%%%%%%%%%

阅读(968) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~