自从上次写了Hilbert图像置乱之后,就对图像置乱研究了一下,发现这里面也是有很多置乱算法的。
Arnold也算一种比较主要的置乱算法,算法由以下变换公式产生:
![eq1](http://latex.codecogs.com/gif.latex?%20%0D%0A%5Cbegin%7Bbmatrix%7D%0D%0Ax_%7Bn+1%7D%5C%5C%20%0D%0Ay_%7Bn+1%7D%0D%0A%5Cend%7Bbmatrix%7D%0D%0A=%0D%0A%5Cbegin%7Bbmatrix%7D%0D%0A1%20&%20b%20%5C%5C%0D%0Aa%20&%20ab+1%0D%0A%5Cend%7Bbmatrix%7D%0D%0A%5Cbegin%7Bbmatrix%7D%0D%0Ax_%7Bn%7D%20%5C%5C%0D%0Ay_%7Bn%7D%0D%0A%5Cend%7Bbmatrix%7D%0D%0Amod%28N%29)
这里a和b是参数,n是迭代次数,N是图像的高或宽。
有了正变换公式,我们还需要反变换公式,正好我最近在学Mathematica,反变换公式就是用这个软件求的。
公式如下:
![eq2](http://latex.codecogs.com/gif.latex?%0D%0A%5Cbegin%7Bbmatrix%7D%0D%0Ax_%7Bn+1%7D%5C%5C%20%0D%0Ay_%7Bn+1%7D%0D%0A%5Cend%7Bbmatrix%7D%0D%0A=%0D%0A%5Cbegin%7Bbmatrix%7D%0D%0Aab+1%20&%20-b%20%5C%5C%0D%0A-a%20&%201%0D%0A%5Cend%7Bbmatrix%7D%0D%0A%5Cbegin%7Bbmatrix%7D%0D%0Ax_%7Bn%7D%20%5C%5C%0D%0Ay_%7Bn%7D%0D%0A%5Cend%7Bbmatrix%7D%0D%0Amod%28N%29)
两个变换矩阵正好是求逆的关系吧,手算也出来了,不过顺便熟悉一下Mathematica,何乐不为呢。
处理结果如下:
原图:
![](https://images0.cnblogs.com/blog/340413/201409/032056035008059.jpg)
置乱后:
![](https://images0.cnblogs.com/blog/340413/201409/032056174854420.jpg)
恢复后:
![](https://images0.cnblogs.com/blog/340413/201409/032056317037709.jpg)
matlab代码如下:
clear all;close all;clc;
img=imread('lena.jpg');
imshow(img,[])
[h w]=size(img);
%置乱与复原的共同参数
n=10;
a=3;b=5;
N=h;
%置乱
imgn=zeros(h,w);
for i=1:n
for y=1:h
for x=1:w
xx=mod((x-1)+b*(y-1),N)+1;
yy=mod(a*(x-1)+(a*b+1)*(y-1),N)+1;
imgn(yy,xx)=img(y,x);
end
end
img=imgn;
end
figure;
imshow(imgn,[])
%复原
img=imgn;
for i=1:n
for y=1:h
for x=1:w
xx=mod((a*b+1)*(x-1)-b*(y-1),N)+1;
yy=mod(-a*(x-1)+(y-1),N)+1 ;
imgn(yy,xx)=img(y,x);
end
end
img=imgn;
end
figure
imshow(imgn,[])
恢复后图像和原图是一样的。