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

  • 14
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: 二维Arnold置乱加密和解密是一种基于Arnold映射的图像加密方法。该方法通过对图像进行置乱操作,使得图像中的像素位置发生变化,从而达到加密的目的。在解密时,通过对置乱后的图像进行反向操作,即可还原出原始图像。 在Matlab实现二维Arnold置乱加密和解密,可以使用Matlab自带的图像处理工具箱,结合Arnold映射算法实现。具体实现步骤如下: 1. 读取待加密图像,将其转换为灰度图像。 2. 对灰度图像进行Arnold置乱操作,得到置乱后的图像。 3. 对置乱后的图像进行Arnold反置乱操作,得到解密后的图像。 4. 将解密后的图像保存为文件。 需要注意的是,在进行Arnold置乱操作时,需要选择合适的置乱参数,以保证加密效果和解密效果的可靠性。同时,在实现过程中,还需要考虑到图像的大小和像素值范围等因素,以确保程序的正确性和稳定性。 总之,二维Arnold置乱加密和解密是一种简单有效的图像加密方法,可以在Matlab中进行实现。通过该方法,可以保护图像的安全性和隐私性,防止图像被非法获取和篡改。 ### 回答2: 二维Arnold置乱算法是一种基于混沌现象的加密算法,它主要应用于图像加密,以保护图像的隐私性和安全性。在图像加密过程中,二维Arnold置乱算法不仅能够混淆图像中的像素值,还能够扰动图像中的像素位置,从而使得其具有较高的安全性和防抵押性。 在Matlab实现二维Arnold置乱算法时,首先需要对输入图像进行一些必要的预处理,如将图像转为灰度图像,将图像的大小调整为二的幂次方等。接着,利用Arnold变换实现图像的置乱,其中Arnold变换是一种二维置换矩阵,通过不断迭代,它可以实现图像中像素位置的混淆。 在Arnold变换中,其参数可用于控制置乱强度,一般取一个较小的值,例如3或4。置乱后的图像可以进一步进行AES加密,以增强加密的安全性。加密过程完成后,可以将加密后的图像传输给接收方,接收方通过解密算法即可还原出原始的图像。 解密算法实现过程与加密算法过程类似,只是在Arnold变换中需要将置乱强度的参数取相反的数值,并将所得的图像进行解密运算。最终得到的图像与原始图像一致,即可根据需要进行后续处理和应用。 需要注意的是,二维Arnold置乱算法虽然具有较高的加密安全性和难度,但在实际应用中仍需考虑到算法的效率和速度。因此,在实现过程中需要结合具体应用需求和场景来进行调整和优化,以提高算法的效率和应用性能。 ### 回答3: 二维 Arnold图像置乱加密及解密,是一种常见的图像加密算法。该算法基于 Arnold 置换、混沌映射等数学原理,以图像的像素矩阵为基础,通过多次置换和混沌映射来加密图像,使得加密后的图像在视觉上无法被识别和还原。本文将以 MATLAB 为例,介绍二维 Arnold图像置乱加密及解密的具体实现方法。 一、算法流程 1.读取原始图像,获取像素信息。 2.使用 Arnold 置换对像素进行置乱。 3.使用混沌映射加密置乱后的图像。 4.将加密后的图像保存至文件中。 5.对保存的加密图像进行解密。 6.使用逆混沌映射解密置乱图像。 7.使用逆 Arnold 置换对图像进行还原。 8.将还原后的图像保存至文件中。 二、算法原理 1.Arnold 置换 Arnold 置换是一种旋转映射,其基本思想是通过若干次旋转运算,将一个二维距阵“塞”到另一个二维矩阵中,从而实现图像的置乱。具体地说,Arnold 置换的矩阵运算公式为: f(x, y) = [(1 1) (1 2)] [x y] mod N 其中,(1 1) 和 (1 2) 表示矩阵的两个元素,x 和 y 分别表示被置乱的图像像素的坐标,N 表示置换次数。 2.混沌映射 混沌映射是一种非线性的动力系统,其基本特点是非周期性、无规则性和混乱性。通过调整混沌映射的参数,可以产生不同的混沌序列,从而实现图像加密的目的。 本文中,我们使用了一种常见的混沌映射算法,即 Logistic 映射。其运算公式为: x(n+1) = ax(n)(1-x(n)) 其中,x(n) 表示第 n 个时刻的值,a 为控制参数,通常取值为3.97。 三、实例展示 1.读取原始图像: 使用以下代码读取原始图像。 im = imread('test.jpg'); 2.Arnold 置换: 使用以下代码图像进行置乱。 N = 4; for i = 1:N for j = 1:N if mod(i+j, 2) == 0 && i <= N/2 % 顺时针旋转90度 im(i:i+N/2-1, j:j+N/2-1, :) = ... im(i:i+N/2-1, j:j+N/2-1, [2 1 3]); end if mod(i+j, 2) == 1 && i > N/2 % 逆时针旋转90度 im(i:i+N/2-1, j:j+N/2-1, :) = ... im(i:i+N/2-1, j:j+N/2-1, [2 1 3]); end end end 3.混沌映射加密: 使用以下代码对置乱后的图像进行加密。 a = 3.97; % 混沌映射参数 x = 0.1; % 初始值 N = size(im, 1); % 图像尺寸 for i = 1:N for j = 1:N x = a*x*(1-x); im(i, j, :) = bitxor(uint8(x*255), im(i, j, :)); end end 4.保存加密后的图像: 使用以下代码加密后的图像保存至文件中。 imwrite(im, 'test_encrypted.bmp'); 5.解密加密后的图像: 使用以下代码读取加密后的图像。 im = imread('test_encrypted.bmp'); 6.逆混沌映射解密: 使用以下代码加密后的图像进行解密。 a = 3.97; % 混沌映射参数 x = 0.1; % 初始值 N = size(im, 1); % 图像尺寸 for i = 1:N for j = 1:N x = a*x*(1-x); im(i, j, :) = bitxor(uint8(x*255), im(i, j, :)); end end 7.逆 Arnold 置换还原图像: 使用以下代码对解密后的图像进行还原。 N = 4; for i = N:-1:1 for j = N:-1:1 if mod(i+j, 2) == 0 && i <= N/2 % 逆时针旋转90度 im(i:i+N/2-1, j:j+N/2-1, :) = ... im(i:i+N/2-1, j:j+N/2-1, [2 1 3]); end if mod(i+j, 2) == 1 && i > N/2 % 顺时针旋转90度 im(i:i+N/2-1, j:j+N/2-1, :) = ... im(i:i+N/2-1, j:j+N/2-1, [2 1 3]); end end end 8.保存还原后的图像: 使用以下代码将还原后的图像保存至文件中。 imwrite(im, 'test_decrypted.jpg'); 四、总结 本文简要介绍了二维 Arnold图像置乱加密及解密的实现方法,其中涉及到的数学知识和 MATLAB 编程技巧,可能对初学者来说有些困难。但是,只要认真分析算法流程和程序实现,按照步骤逐一实现,就能够成功完成图像加密和解密的操作。同时,该算法的可靠性和安全性还需要进行更加深入的研究和探索。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值