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 |
变换周期计算代码
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()