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

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


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

[ x n + 1 y n + 1 ] = [ 1 b a a b + 1 ] [ x n y n ] m o d ( N )

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

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

[ x n + 1 y n + 1 ] = [ a b + 1 b a 1 ] [ x n y n ] m o d ( 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

猜你喜欢

转载自blog.csdn.net/qq_33472557/article/details/79668662