基于Arnold变换的图像置乱Arnold变换是俄国数学家Vladimir I.
Arnold提出的一种变换,一幅N ×N的数字图像的二维Arnold
变换定义为:
注意:x,y是原图像的像素坐标,x',y'是变换后的像素坐标。保证|ad-bc|=1,如置换矩阵系数设为a=b=1,c=2,d=3,置换次数n=20,则他们被当作密钥key,用于解密。
Arnol变换的图像类型只能是N*N的图片。
1、灰度图像的二维 Arnold 的图像置乱加密及解密
(1)编写一个arnold.m文件与iarnold.m文件
function
[outImg]=arnold(inImg,key) % arnold置乱函数,inImg为输入图像,key为密钥。
%key=[Times,a,b,c,d];
[h,w]=size(inImg);
outImg=uint8(zeros(h,w));
tempImg=inImg; %定义中间变量
if iH
~= %判断密钥的合法性
error('The cover must be a square !');
return;
elseif
size(key,2) ~=5;
error('The
key must be 5 numbers !');
return;
elseif
(key(2)*key(5)-key(3)*key(4)) ~=1;
error('The Arnold Matrix is not valid !');
return;
end
for
i=1:key(1) %执行置乱的次数
for
u=1:h %将像素坐标置乱
for v=1:w
temp=tempImg(u,v); %获取坐标(u,v)处的像素值
ax=mod((key(2)*(u-1)+key(3)*(v-1)),w)+1;
ay=mod((key(4)*(u-1)+key(5)*(v-1)),w)+1;
outImg(ax,ay)=temp; %在新的坐标中赋上原来的像素值
end
end
tempImg=outImg;
end
outImg=tempImg; %输出图像
function
[outImg]=iarnold(inImg,key) %解密函数,inImg为加密图片,key为加密密钥
%key=[Times,a,b,c,d];
ik=round(inv([key(2),key(3);key(4),key(5)]));%必须进行取整(不能出现小数操作)或转换为Uint8类型。ik为arnold逆矩阵
ikey(2)=ik(1,1);ikey(3)=ik(1,2);ikey(4)=ik(2,1);ikey(5)=ik(2,2);
[h,w]=size(inImg);
outImg=uint8(zeros(h,w));
tempImg=inImg;
if h~=w
error('The
cover must be a square !');
return;
elseif size(key,2)~=5;
error('The
key must be 5 numbers !');
return;
elseif abs((key(2)*key(5)-key(3)*key(4)))~=1;
error('The
Arnold Matrix is not valid !');
return;
end
for i=1:key(1)
for
u=1:h
for v=1:w
temp=tempImg(u,v);
ax=mod((ikey(2)*(u-1)+ikey(3)*(v-1)),w)+1;
ay=mod((ikey(4)*(u-1)+ikey(5)*(v-1)),w)+1;
outImg(ax,ay)=temp;
end
end
tempImg=outImg;
end
outImg=tempImg;
(2)图像处理程序
加密置乱:
close all;
clear all;
a=imread('gflower.jpg'); %取要处理的图像
subplot(1,2,1);imshow(a);
title('original');
key=[5,5,2,7,3]; %设置密钥
aa=arnold(a,key); %加密运算
subplot(1,2,2);
imshow(aa); %显示处理效果title(' Permuted');
imwrite(aa,’aflower.bmp’); %保存结果(不能采用JPG等压缩格式保存,否则还原将失真)
解密还原:
b=imread(‘aflower.bmp’); %取加密图像
subplot(1,2,1);imshow(a);title('original');
key=[5,5,2,7,3]; %加密方提供的密钥
ib=iarnold(b,key); %进行解密运算
subplot(1,2,2);imshow(ib); %显示解密后的图像
title('
Decrypted');
imwrite(ib,’jiemi.bmp’); %保存图像
RGB图像加密及加密的复制性分析:
见下一篇《二维 Arnold 的图像置乱加密及解密——Matlab实现(2)》