MATLAB 如何创建n维Arnold变换矩阵

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/30 00:19:42
MATLAB 如何创建n维Arnold变换矩阵

MATLAB 如何创建n维Arnold变换矩阵
MATLAB 如何创建n维Arnold变换矩阵

MATLAB 如何创建n维Arnold变换矩阵
Arnold变换是一种常用的图像置乱技术,Arnold变换的定义如下:
对任意N*N矩阵(所有元素都相同的矩阵除外),设i,j为矩阵元素原始下标,经过Arnold变换后新下标为i',j',且满足下式:
i'=(i+j)mod N
j'=(i+2j)mod N
i,j:0,1,.N-1
Arnold变换具有周期性,即经过若干次变换后,矩阵回到最初状态,且周期T与N的大小有关.理论基础没找到,但可以用程序来进行计算,可以设i,j从一个点出发,不断使用以上变换,再次回到这个起点时,经历的变换次数就是周期.
Matlab程序:
x=1;y=1;
T=1;m=90; %T为要计算的周期
t=x;x=x+y;y=t+2*y;
while =1&y~=1;
T=T+1;
if x>m
x=mod(x,m);
end
if y>m
y=mod(y,m);
end
t=x;x=x+y;y=t+2*y;
end
图像的置乱算法(来源于网落共享资源):
clc
clear all;
iTimes=10; %置乱次数
% 读入水印图像
file_name='d:\\mark.bmp';
message=double(imread(file_name));
%水印图像矩阵的行数与列数
Mm=size(message,1);
Nm=size(message,2);
%对水印图像进行arnold置乱
if Mm~=Nm
error('水印矩阵必须为方阵');
end
if Mm~=256
error('必须为90*90大小,或者修改置乱次数');
end
tempImg=message; %图像矩阵赋给tempImg
for n=1:iTimes %置乱次数
for u=1:Mm
for v=1:Nm
temp=tempImg(u,v);
ax=mod((u-1)+(v-1),Mm)+1; %新像素行位置
ay=mod((u-1)+2*(v-1),Nm)+1; %新像素列位置
outImg(ax,ay)=temp;
end
end
tempImg=outImg;
end
% 显示水印,嵌入水印图像与原始图像
figure(1)
subplot(1,3,1);
imshow(message,[]);
title('原始水印');
subplot(1,3,2)
imshow(outImg,[]);
title('置乱水印');
% arnold反置乱
message_arnold=tempImg;
iTimes1=192-iTimes
%置乱后水印图像矩阵的行数与列数
Mo=size(outImg,1);
No=size(outImg,2);
for n=1:iTimes1 % 次数
for u=1:Mo
for v=1:No
temp1=tempImg(u,v);
bx=mod((u-1)+(v-1),Mo)+1;
by=mod((u-1)+2*(v-1),No)+1;
outImg1(bx,by)=temp1;
end
end
tempImg=outImg1;
end
message=outImg1;
% 显示反置乱后水印
%figure(3)
%subplot(1,3,1);
%imshow(message_arnold,[]);
%title('提取的置乱水印');
subplot(1,3,3);
imshow(message,[]);
title('反置乱(恢复)水印');
%subplot(1,3,3);
%imshow(orig_watermark,[])
%title('原始水印');
希望以上程序能给大家对Arnold算法有一定的理解.