Arnold变换详解

Arnold变换详解,第1张

利用Arnold变换(又称猫脸变换)可以对图像进行置乱,使得原本有意义的图像变成一张无意义的图像。该变换可以在其它图像处理前对图像做预处理,例如在数字盲水印嵌入前对水印进行置乱。也可以用于普通的图像加密。

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

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

Arnold变换不仅可以用于图像置乱,也可以用于其它数据的置乱和加密。

狭义的猫脸变换即最简单的一种变换。网络上绝大部分关于Arnold变换的博客都是狭义Arnold变换。

矩阵运算公式为:

置乱的实质是新位置与旧位置的映射,且该映射是一一对应的 。下图是一次猫脸变换的示意图:

此处宽高需要相等是方便后续的逆变换。

如图所示,一次变换后,原图得到了一定程度的置乱,但还能分辨出原始图像的信息,6次变换后图像已看不出原始图像的信息。

当一张图片的宽度和高度相同时,Arnold变换具有逆变换。虽然Arnold变换具有周期性,可以通过一直变换下去得到原图,但是周期越长,恢复原图也越长。通过逆变换可以较为方便地把变换后的图像恢复。

转换为多项式为:

逆变换的效果当然就是把图像复原了。此处就不在贴效果图了。

如前文所述,只要错切的单位满足取模回填后,原图与变换后的图能够一一对应,那么该变换就是有效的。满足这个条件的公式是:

其逆变换公式为:

这里只列出了用于Android的一维数组形式:

对于广义Arnold变换,当a、b、count任何一个值不同时,变换后图像也是不相同的。因此,可以把(a、b、count)作为加密参数对图像进行加密。此外,还可以对图像的不同部分进行不同的加密,使得更难破解。例如,可以把图像分为四份(甚至可以有交集),分别对每一份子图进行加密,这样又增大了破解的难度。

Arnold加密后,如果图像被破坏了,例如压缩、涂改等。解密后的图像依然能恢复一部分数据。

下图是以参数(7,11,4)加密的图像,以及对加密后的图像进行涂抹后再解密的结果。

可以看出Arnold变换有较高的鲁棒性,即使添加了多个较大的圆也能恢复出原图的大致信息。

根据Arnold变换的原理,我们还可以用来加密其它数据,而不仅仅是图像。

Arnold变换是一种常用的图像置乱技术,Arnold变换的定义如下:

对任意N*N矩阵(所有元素都相同的矩阵除外),设i,j为矩阵元素原始下标,经过Arnold变换后新下标为i',j',且满足下式:

i'=(i+j)mod N

j'=(i+2j)mod N

i,j:0,1,.........N-1

Arnold变换具有周期性,即经过若干次变换后,矩阵回到最初状态,且周期T与N的大小有关。理论基础没找到,但可以用程序来进行计算,可以设i,j从一个点出发,不断使用以上变换,再次回到这个起点时,经历的变换次数就是周期。

Matlab程序:

x=1y=1

T=1m=90 %T为要计算的周期

t=xx=x+yy=t+2*y

while x~=1&y~=1

T=T+1

if x>m

x=mod(x,m)

end

if y>m

y=mod(y,m)

end

t=xx=x+yy=t+2*y

end

图像的置乱算法(来源于网落共享资源):

clc

clear all

iTimes=10%置乱次数

% 读入水印图像

file_name='d:\\mark.bmp'

message=double(imread(file_name))

%水印图像矩阵的行数与列数

Mm=size(message,1)

Nm=size(message,2)

%对水印图像进行arnold置乱

if Mm~=Nm

error('水印矩阵必须为方阵')

end

if Mm~=256

error('必须为90*90大小,或者修改置乱次数')

end

tempImg=message%图像矩阵赋给tempImg

for n=1:iTimes %置乱次数

for u=1:Mm

for v=1:Nm

temp=tempImg(u,v)

ax=mod((u-1)+(v-1),Mm)+1 %新像素行位置

ay=mod((u-1)+2*(v-1),Nm)+1 %新像素列位置

outImg(ax,ay)=temp

end

end

tempImg=outImg

end

% 显示水印,嵌入水印图像与原始图像

figure(1)

subplot(1,3,1)

imshow(message,[])

title('原始水印')

subplot(1,3,2)

imshow(outImg,[])

title('置乱水印')

% arnold反置乱

message_arnold=tempImg

iTimes1=192-iTimes

%置乱后水印图像矩阵的行数与列数

Mo=size(outImg,1)

No=size(outImg,2)

for n=1:iTimes1 % 次数

for u=1:Mo

for v=1:No

temp1=tempImg(u,v)

bx=mod((u-1)+(v-1),Mo)+1

by=mod((u-1)+2*(v-1),No)+1

outImg1(bx,by)=temp1

end

end

tempImg=outImg1

end

message=outImg1

% 显示反置乱后水印

%figure(3)

%subplot(1,3,1)

%imshow(message_arnold,[])

%title('提取的置乱水印')

subplot(1,3,3)

imshow(message,[])

title('反置乱(恢复)水印')

%subplot(1,3,3)

%imshow(orig_watermark,[])

%title('原始水印')

希望以上程序能给大家对Arnold算法有一定的理解。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11629405.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存