图像加密笔记之arnold变换及matlab代码实现

arnold变换,有时候也叫做阿诺德置乱,猫脸变换(Cat Map),因为提出这种算法的数学家拉基米尔·阿诺德最早将其应用于一张猫的图片上。
arnold变换是图像加密领域的一个经典置乱算法,所谓置乱,就是打乱图片上各个像素点的位置,以消除原图片相邻像素间的相关性。
这个算法的实现步骤并不复杂。
[ x ′ y ′ ] = [ 1 b a a b + 1 ] ∗ [ x n y n ] m o d ( N ) \begin{bmatrix} {x{'}}\\ {y{'}}\\ \end{bmatrix}=\begin{bmatrix} {1{}}&b\\ {a{}}&ab+1\\ \end{bmatrix}*\begin{bmatrix} {x{n}}\\ {y{n}}\\ \end{bmatrix}mod(N) [xy]=[1abab+1][xnyn]mod(N)
(xn,yn)是像素的原始位置,(x’,y’)是置乱后的位置,a,b可以自己进行指定。mod(N)是指对N取余,N为图像的长或宽。对简单情况,即长宽相同的图像,讨论的话,长和宽都等于N。进行这一步的目的应该是为了将更新后的像素位置的长和宽都限定在原图像的长和宽N以内。
当a=1,b=1时,可以直接写成:
x’ = xn + yn
y’ = xn + 2yn
该算法的逆变换,即由置乱后的图像恢复到原图算法为:
[ x n y n ] = [ a b + 1 − b − a 1 ] ∗ [ x ′ y ′ ] m o d ( N ) \begin{bmatrix} {x{n}}\\ {y{n}}\\ \end{bmatrix}=\begin{bmatrix} {ab+1{}}&-b\\ {-a{}}&1\\ \end{bmatrix}*\begin{bmatrix} {x{'}}\\ {y{'}}\\ \end{bmatrix}mod(N) [xnyn]=[ab+1ab1][xy]mod(N)
置乱效果:
下面是一个图像使用arnold变换(a=2,b=3)后的置乱效果:
原图像:
在这里插入图片描述

置乱1轮:
在这里插入图片描述

置乱5轮:
在这里插入图片描述

置乱10轮:
在这里插入图片描述

恢复图像:
在这里插入图片描述

代码实现起来也并不复杂。
arnold变换置乱代码(Matlab):

img_new = zeros(h,w)    %[h, w]=size(img) 
for i=1:n   %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

还原代码(Matlab):

img=img_new;
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_new(yy,xx)=img(y,x);                   
        end
    end
    img=imgn;
end

不过上述代码是针对灰度图像,且长宽相等的图像进行处理的,如果不是灰度图像,需要进行以下转换:

X = imread('输入图像.jpg'); 

I = rgb2gray(X); 

经典的arnold变换有很多局限。比如说只能对长宽相等的图像进行处理。一般可以通过对图像进行分块填充等客服这个限制。但除此之外,还有一些其他缺点,比如它必须通过多次的置乱来达到一个比较好的效果,且变换具有周期性,密钥空间不足等。

猜你喜欢

转载自blog.csdn.net/qq_44672855/article/details/117170118