简介
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}
[x′y′]=[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}
[x′y′]=[ab+1−b−a1]∗[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++代码几乎一样。。。
先取到高宽,再生成一个相同大小的图片,光栅扫描做映射即可。
实验效果
Lenna灰度图实验效果如上,对应标题表示变换次数。