Python实现Arnold图像置乱算法

简介

Arnold置乱俗称猫脸变换,因为最开始用的Demo图是一张猫脸。
这个算法可以让一张图片从有序变成无序,逆变换可以让他从无序变成有序(合法情况下),同时他还具有一定的周期性,一直正向变化也可以从有序->无序->有序,但由于加密密钥方式很多,置乱的周期也可能不一样,因此选择一个合适的密钥能够使得攻击者花费很多时间也无法破解,增加破解成本。

基本原理

类似于传统的图像变换(平移缩放等),他是一个矩阵相乘的方法
[ x ′ y ′ ] = [ 1 a b a b + 1 ] ∗ [ x y ] m o d   N \begin{gathered} \begin{bmatrix} x' \\ y' \end{bmatrix}= \begin{bmatrix} 1 & a \\ b & ab + 1 \end{bmatrix} * \begin{bmatrix} x \\ y \end{bmatrix}mod \ N \end{gathered} [xy]=[1baab+1][xy]mod N
对应的逆变换则是
[ x ′ y ′ ] = [ a b + 1 − a − b 1 ] ∗ [ x y ] m o d   N \begin{gathered} \begin{bmatrix} x' \\ y' \end{bmatrix}= \begin{bmatrix} ab + 1 & -a \\ -b & 1 \end{bmatrix} * \begin{bmatrix} x \\ y \end{bmatrix}mod \ N \end{gathered} [xy]=[ab+1ba1][xy]mod N
该映射能够保证一一对应,达到图像变换的效果。

Python代码实现

def arnold(img):
    r, c = img.shape
    p = np.zeros((r, c), np.uint8)
    a = 1
    b = 1
    for i in range(r):
        for j in range(c):
            x = (i + b * j) % r
            y = (a * i + (a * b + 1) * j) % c
            p[x, y] = img[i, j]
    return p

def dearnold(img):
    r, c = img.shape
    p = np.zeros((r, c), np.uint8)
    a = 1
    b = 1
    for i in range(r):
        for j in range(c):
            x = ((a * b + 1) * i - b * j) % r
            y = (-a * i + j) % c
            p[x, y] = img[i, j]
    return p

代码很短,效果很强。
输入一张图片,返回一张图片。
C++代码几乎一样。。。
先取到高宽,再生成一个相同大小的图片,光栅扫描做映射即可。

实验效果

img
Lenna灰度图实验效果如上,对应标题表示变换次数。

后记

教程_隐写术入门之Arnold置乱

  • 4
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值