MATLAB 如何创建n维Arnold变换矩阵
理论基础没找到,但可以用程序来进行计算,可以设i,j从一个点出发,不断使用以上变换,再次回到这个起点时,经历的变换次数就是周期。Matlab程序:x=1;y=1;T=1;m=90;%T为要计算的周期t=x;x=x+y;y=t+2*y;whilex~=1&y~=1;T=T+1;ifxmx=mod(x,m);endifymy=mod(y,m);endt=x;x=x+y;y=t+2*y;end图像的置乱算法(来源于网落共享资源):clcclearall;iTimes=10;%置乱次数%读入水印图像file_name='d:\\mark.bmp';message=double(imread(file_name));%水印图像矩阵的行数与列数Mm=size(message,1);Nm=size(message,2);%对水印图像进行arnold置乱ifMm~=Nmerror('水印矩阵必须为方阵');endifMm~=256error('必须为90*90大小,或者修改置乱次数');endtempImg=message;%图像矩阵赋给tempImgforn=1:iTimes%置乱次数铅族foru=1:Mmforv=1:Nmtemp=tempImg(u,v);ax=mod((u-1)+(v-1),Mm)+1;%新像素行位置ay=mod((u-1)+2*(v-1),Nm)+1;%新像素列位置outImg(ax,ay)=temp;endendtempImg=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);forn=1:iTimes1%次数foru=1:Moforv=1:Notemp1=tempImg(u,v);bx=mod((u-1)+(v-1),Mo)+1;by=mod((u-1)+2*(v-1),No)+1;outImg1(bx,by)=temp1;endendtempImg=outImg1;endmessage=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算法有一定的理解。