这件事情的起因是这样的,我需要研究一下各种图像置乱的算法。然后在知乎上找到了一篇关于Arnold变化的文章,但是呢,这个人实际上是卖资料,代做大作业的。详细的代码根部不给你,则给我气坏了,必须要手动实现一下,打击他卖资料的嚣张气焰。
文章目录
- 代码编写
- 周期分析
简书上的一个作者写的还是相当不错的,这是网址链接。
Arnold 变换是俄国数学家 Vladimir I. Arnold提出的一种变换,一幅
N
×
N
N ×N
N×N 的数字图像的二维Arnold
变换定义为:
[ x ′ y ′ ] = [ a b c d ] n [ x y ] m o d N \left[\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right]=\left[\begin{array}{ll} a & b \\ c & d \end{array}\right]^{n}\left[\begin{array}{l} x \\ y \end{array}\right] \bmod N [x′y′]=[acbd]n[xy]modN
注意: x x x, y y y 是原图像的像素坐标, x ′ x' x′, y ′ y' y′ 是变换后的像素坐标。保证 ∣ a d − b c ∣ = 1 |ad-bc|=1 ∣ad−bc∣=1,如置换矩阵系数设为 a = b = 1 a=b=1 a=b=1, c = 2 c=2 c=2, d = 3 d=3 d=3,置换次数 n = 20 n=20 n=20,则他们被当作密钥 key,用于解密。Arnold 变换的图像类型只能是 N × N N\times N N×N 的图片。
我从网络上面下载了一朵花的图片,如下
代码编写
close all;
%图像加密置乱:
a=imread('flower.png'); %取预处理图像
a=a(1:226,1:226,1:3); %截取成正方形
R=a(:,:,1); %取图像的R层像素
G=a(:,:,2); %取图像的G层像素
B=a(:,:,3); %取图像的B层像素
figure;
subplot(2,2,1);imshow(a);title('original');
subplot(2,2,2);imshow(R);title('R');
subplot(2,2,3);imshow(G);title('G');
subplot(2,2,4);imshow(B);title('B');
%三个不同密钥
keyR=10;keyG=20;keyB=30;
aR=arnold(R,keyR,1);aG=arnold(G,keyG,1);aB=arnold(B,keyB,1);%对各层用不同的密钥加密
figure;
subplot(2,2,1);imshow(aR);title('aR');%加密后的图像
subplot(2,2,2);imshow(aG);title('aG');
subplot(2,2,3);imshow(aB);title('aB');
aa=cat(3,aR,aG,aB); %各层加密后在合成彩色图像
subplot(2,2,4); imshow(aa); title(' Permuted');%RGB图像加密后的结果
imwrite(aa,'a_flower.bmp');
%图像解密
R=arnold(aR,keyR,0);G=arnold(aG,keyG,0);B=arnold(aB,keyB,0);%对各层用不同的密钥加密
R=uint8(R);G=uint8(G);B=uint8(B);
figure;
subplot(2,2,1);imshow(R);title('R');
subplot(2,2,2);imshow(G);title('G');
subplot(2,2,3);imshow(B);title('B');
flower=cat(3,R,G,B); %各层加密后在合成彩色图像
subplot(2,2,4); imshow(flower); title('恢复的图案');%RGB图像解密后的结果
arnold.m
是一个单独的函数文件
function img=arnold(img,key,pon)
%img是原始图片
%Key是输入的密钥
%a,b是置乱矩阵里面的值
%pon表示正变换或者反变换
[h, w]=size(img);
a=2;b=3;
img_new = zeros(h,w); %[h, w]=size(img)
N=h;
if(pon)%正变换
for i=1:key %n为置乱轮数
for y=1:h
for x=1:w
xx=mod((x-1)+b*(y-1),N)+1; %a,b可提前指定
yy=mod(a*(x-1)+(a*b+1)*(y-1),N)+1;
img_new(yy,xx)=img(y,x);
end
end
img=img_new;
end
else%反变换
for i=1:key
for y=1:h
for x=1:w
xx=mod((a*b+1)*(x-1)-b*(y-1),N)+1;
yy=mod(-a*(x-1)+(y-1),N)+1 ;
img_new(yy,xx)=img(y,x);
end
end
img=img_new;
end
end
周期分析
理论上下面的代码是可以计算周期的,但是我跑到了 1 0 7 10^7 107 的数量级,依然没有闭环。等以后如果弄明白了再来讲吧。
%计算Arnold变换的周期T可以利用一下MATLAB程序来实现。
x = 1; y = 1;N = 4; %N × N为128 ×128的图像
T = 1;
t = x; x = x + y; y = 2*t+3*y;
while x~= 1 || y~= 1
T = T + 1;
if x >N
x =mod ( x,N) ;
end
if y >N
y =mod ( y,N) ;
end
t = x; x = x + y; y = 2*t+3*y;
end
T %所得的T值即为Arnold变换的周期