Arnold变换是俄国数学家VladimirI.Arnold提出的一种变换
一幅M*N的数字图像的二维Arnold 变换定义为:
其中 表示变换前灰度图中像素的位置, 表示变换之后的像素位置, 为参数, 表示当前变换的次数, 为图像的长或宽(由于该算法只适用于长宽相等的图像,所以我们不讨论M不等于N的情况),mod为模运算。
数字图像可以看为一个二维矩阵,经过Arnold变换之后图像的像素位置会重新排列,这样图像会显得杂乱无章,从而实现了对图像的置乱加密效果。
置乱代码:
%img 灰度图像 a,b为参数 n为变换次数
function arnoldImg = arnold(img,a,b,n)
[h,w] = size(img);
N=h;
arnoldImg = zeros(h,w);
for i=1:n
for y=1:h
for x=1:w
%防止取余过程中出现错误,先把坐标系变换成从0 到 N-1
xx=mod((x-1)+b*(y-1),N)+1;
yy=mod(a*(x-1)+(a*b+1)*(y-1),N)+1;
arnoldImg(yy,xx)=img(y,x);
end
end
img=arnoldImg;
end
arnoldImg = uint8(arnoldImg);
end
复原时用变换矩阵的逆矩阵即可
复原代码:
function img = rearnold(arnoldImg,a,b,n)
[h,w] = size(arnoldImg);
img = zeros(h,w);
N = h;
for i=1:n
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(yy,xx)=arnoldImg(y,x);
end
end
arnoldImg=img;
end
img = uint8(img);
end