在阅读文献的时候,提到了一种图像置乱的通用方法,即正弦映射混沌变换,其公式和原理如下:
我的理解是:通过初值x0进行正弦映射的迭代,得到一连串的xn,将xn乘以(K-1)再取整,就变成了一个[0,K-1]范围内的整数,K为图像的长和宽的乘积。从原图的第一个像素进行迭代,利用得到的一个一维的整数数组,第i个位置的整数就是第i个像素的新位置。然后根据新位置进行位移即可对图像置乱。
当然,迭代得到的整数可能会有重复,因此我创建一个新的数组,记录每个像素是否已经对应一个新位置(新整数)。我用MATLAB进行实验,代码如下:
x0=input('请输入初值x0:');
L=input('请输入舍弃的次数L:');
K=h*w;
% 不重复的小数集合
x=zeros(1,K+L);
% 最终的整数集合
xn=zeros(1,K);
% 记录在哪个位置上还没有计算到
tag=zeros(1,K);
x(1)=x0;
i=1;
flag=0;
while sum(tag)~=K
next=0.999*sin(pi*x(i));
t=floor(next*K);
if i>L
if tag(t)==0
tag(t)=1;
i=i+1;
x(i)=next;
xn(i-L)=t;
else
x(i)=next;
end
else
i=i+1;
x(i)=next;
end
flag=flag+1;
end
代码中的h和w分别是图像的长和高,即696×696,初值x0=0.666,舍弃数量L=10.我没有运算完,差不多运行了20分钟,结果如下:
结果表明,循环了425万次,其中新位置不重复的只有46万多个,总共需要对48万多个像素进行置乱,还是没有对每个像素都映射到新的位置。
所以我的思路不是一一映射,而且运行效率极低,说明并不对,因此我想问正确的正弦映射混沌变换的思路是什么?