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=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=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()
|