您的位置:首页 > 编程语言 > MATLAB

基于Arnold变换的图像置乱-Matlab实现

2018-03-23 15:53 274 查看

Arnold变换是俄国数学家VladimirI.Arnold提出的一种变换

一幅M*N的数字图像的二维Arnold 变换定义为:

[xn+1yn+1]=[1abab+1][xnyn]mod(N)[xn+1yn+1]=[1baab+1][xnyn]mod(N)

其中x,yx,y表示变换前灰度图中像素的位置,xn+1,yn+1xn+1,yn+1表示变换之后的像素位置,a,ba,b为参数,nn表示当前变换的次数,NN为图像的长或宽(由于该算法只适用于长宽相等的图像,所以我们不讨论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


复原时用变换矩阵的逆矩阵即可

[xn+1yn+1]=[ab+1−a−b1][xnyn]mod(N)[xn+1yn+1]=[ab+1−b−a1][xnyn]mod(N)



复原代码:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息