Arnold置乱变换

再接再厉,发个Arnold置乱变换的matlab代码2008-05-05 21:30以下是代码,自已看吧。。希望对于初学者有所帮助

function Arnold(Image,Frequency,crypt)
%图像数值矩阵Arnold转换函数
%输入参数
% Image: 待加密(待解密)图像文件名(注意写格式后缀),只能为二维
% Frequency: 图像需要变换迭的次数
% crypt 0~加密;1~解密

%输出参数
% M: 转换后图像数据矩阵
% 输出由M对应的图像文件
if nargin<3
disp('请按程序的输入参数格式输入参数!!!');
return;
end

if crypt~=0 & crypt~=1
disp('encrypt 必须为0或1!');
end

%将Q赋值给M,计算Q的大小
Q=imread(Image);
M = Q ;
Size_Q = size(Q);

%如果不是二维或三维数组,则不处理,返回
if (length(Size_Q) <= 2)
if Size_Q(1) ~= Size_Q(2)
disp('不是方阵,不能Arnold转换');
return
end
else
disp('不是二维数组,不进行Arnold变换');
return
end

%------------------------------------------
%Arnold转换
n = 0;
K = Size_Q(1);

M1_t = Q;
M2_t = Q;

if crypt==1 %解密
Frequency=ArnoldPeriod( Size_Q(1) )-Frequency;
end

for s = 1:Frequency
n = n + 1;
if mod(n,2) == 0
for i = 1:K
for j = 1:K
c = M2_t(i,j);
M1_t(mod(i+j-2,K)+1,mod(i+2*j-3,K)+1) = c;
end
end
else
for i = 1:K
for j = 1:K
c = M1_t(i,j);
M2_t(mod(i+j-2,K)+1,mod(i+2*j-3,K)+1) = c;
end
end
end
end

if mod(Frequency,2) == 0
M = M1_t;
else
M = M2_t;
end
%------------------------------------------
%imwrite( double(M)/255,strcat( 'Arnold_',num2str(Frequency),'_',Image ),'bmp' );
imshow(M);

function Period=ArnoldPeriod(N)
% 求周期
if ( N<2 )
Period=0;
return;
end

n=1;
x=1;
y=1;
while n~=0
xn=x+y;
yn=x+2*y;
if ( mod(xn,N)==1 && mod(yn,N)==1 )
Period=n;
return;
end
x=mod(xn,N);
y=mod(yn,N);
n=n+1;
end
----------------------------------------------------------------------------------
%arnold 测试!!!!!

function Arnold(Image,times,crypt)%参数分别为:图像矩阵,变换次数,0表示加密,1表示解密
%将Q赋值给M,计算Q的大小
Q=Image;
M = Q;
Size_Q=size(Q);
%条件性判断
if length(Size_Q) <= 2
if Size_Q(1) ~= Size_Q(2)
disp('不是方阵,无法进行Arnold转换');
return
end
else
disp('不是二维数组,无法进行Arnold变换');
return
end

%---Arnold转换
n = 0;
K = Size_Q(1);

M1_t = Q;
M2_t = Q;

if crypt==1 %解密
times=ArnoldPeriod( Size_Q(1) )-times;
end

for s =

1:times
n = n + 1;
if mod(n,2) == 0
for i = 1:K
for j = 1:K
c = M2_t(i,j);
M1_t(mod(i+j-2,K)+1,mod(i+2*j-3,K)+1) = c;
end
end
else
for i = 1:K
for j = 1:K
c = M1_t(i,j);
M2_t(mod(i+j-2,K)+1,mod(i+2*j-3,K)+1) = c;
end
end
end
end

if mod(times,2) == 0
M = M1_t;
else
M = M2_t;
end
%------------------------------------------
%imwrite( double(M)/255,strcat( 'Arnold_',num2str(Frequency),'_',Image ),'bmp' );
imshow(M);

function Period=ArnoldPeriod(N)
% 求周期
if ( N<2 )
Period=0;
return;
end

n=1;
x=1;
y=1;
while n~=0
xn=x+y;
yn=x+2*y;
if ( mod(xn,N)==1 && mod(yn,N)==1 )
Period=n;
return;
end
x=mod(xn,N);
y=mod(yn,N);
n=n+1;
end



subplot(3,2,1);
i=imread('gray.jpg');
if isrgb(i)
i=rgb2gray(i);
end
imshow(i,[]);
title('原始图像');
NewImg=i;
NewImg=Arnold(i,2,0);
subplot(3,2,2);
imshow(NewImg,[]);
title('Arnold错乱图像');
NewImg=Arnold(i,2,1);
subplot(3,2,3);
imshow(NewImg,[]);
title('Arnold错乱图像');

a=1;
if a>1
a=a+1;
elseif a>2
a=a+1;
elseif a>3
a=a+1;
elseif a>4
a=a+1;
else
a=a+1;
end

相关主题
相关文档
最新文档