0%

Arnold变换

Arnold变换又称之为猫脸变换,利用Arnold变换(又称猫脸变换)可以对图像进行置乱。

Arnold变换使得原本有意义的图像变成一张无意义的图像,该变换可以在其它图像处理前对图像做预处理,例如在数字盲水印嵌入前对水印进行置乱。也可以用于普通的图像加密。对于不同的数字图像,加密者都可以用相应的离散化Arnold矩阵进行变换,图像的位置变换实际上是对应点的灰度值或者RGB颜色值的移动,即将原来点(x,y)处的值对应的灰度值移动至变换后的位置处,起到置乱的作用。Arnold变换不仅可以用于图像置乱,也可以用于其它数据的置乱和加密,变换公式如下:

其中mod是取模运算,N是正方形图像的边长,( x’ , y’ )是像素点( x , y )变换后的坐标。

当图像是一张方形的图像时,Arnold变换存在逆变换,经过N次Arnold变换后的数据可以通过N次逆变换恢复数据,逆变换公式如下:

通常一次Arnold变换达不到理想效果,需要对图像进行连续多次的变换。Arnold变换具有周期性,即对图像连续进行Arnold变换,最终又能得到原图像。变换的周期和图像的尺寸有关,统计如下表:

表1-1 Arnold变换周期

边长N 2 4 8 16 32 64 128 246 512 1024
周期T 3 3 6 12 24 48 96 192 384 768

变换周期计算代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

'''
功能:计算Arnold变换周期,默认为狭义Arnold变换
参数:
N--正方形图像宽的像素数
Arnold变换矩阵参数,a、b、c、d
'''

def Arnold_period(N,a=1,b=1,c=1,d=2):
#计算(posx,posy)位置Arnold变换的周期(与整个图像Arnold周期应该一致,待证)
posx=0
posy=1
#变换的初始位置
x0=posx
y0=posy
T=0
while True:
x=(a*x0+b*y0)%N
y=(c*x0+d*y0)%N
#x0,y0同时更新
x0,y0=x,y
T+=1
if(x==posx and y==posy):
break
return T

def main():
N=[]
T=[]
for i in range(1,11):
N.append(2**i)
T.append(Arnold_period(2**i,1,1,1,2))
plt.axis('off')
#绘制表格展示结果
data=dict()
data['N']=N
data['T']=T
print(data)
df=pd.DataFrame(data)
plt.table(cellText=df.values,colLabels=df.columns,bbox=[0,0,1,1],loc='center')
plt.show()


if __name__== '__main__':
main()
------------- THE END! THANKS! -------------