[图像置乱]正弦映射的混沌变换原理是什么?

在阅读文献的时候,提到了一种图像置乱的通用方法,即正弦映射混沌变换,其公式和原理如下:

img

我的理解是:通过初值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分钟,结果如下:

img

结果表明,循环了425万次,其中新位置不重复的只有46万多个,总共需要对48万多个像素进行置乱,还是没有对每个像素都映射到新的位置。
所以我的思路不是一一映射,而且运行效率极低,说明并不对,因此我想问正确的正弦映射混沌变换的思路是什么?