吉尔伯特曲线可视化
把混淆算法的第一步摊开来看:曲线如何一笔画完整个矩形,位移量 k 又是如何决定像素搬家的距离。
起点:曲线序 0
遍历路径
当前播放位置
位移后的落点
怎么看这张图:蓝色到黄色的折线就是吉尔伯特曲线的遍历路径,它从起点出发,不重不漏地走遍每一个格子,最后在终点收束。折线的先后顺序,就是算法里那条一维队列的顺序。
动手验证
用一张合成图看位移到底做了什么
下面这张 132 × 88 的图案由本站临时生成,包含渐变、圆形、色块和文字,结构足够明显,便于判断顺序是否被打乱。点击按钮会调用与工具页完全相同的置换函数。
原始图案
生成后未经任何处理。
混淆结果
待处理
再解混淆
待处理
这里走的是纯内存链路,没有经过任何有损编码,所以第三步的结果会与原图逐字节一致。换成 JPEG 保存再读取,就会出现肉眼可见的噪点——差别不在算法,而在格式。
观察要点
三个值得停下来看一眼的地方
曲线不会自交
把网格调到 8 × 8 并显示序号,会看到每个格子恰好出现一次。这正是「双射」——可逆性的全部前提。只要有一个格子被访问两次、另一个被漏掉,解混淆就不可能还原。
相邻不等于相邻
曲线序相差 1 的两个格子,在网格上几乎总是紧挨着的;但曲线序相差 k 的两个格子,位置通常隔得很远。混淆做的就是把这两类关系对调,让二维邻域彻底失效。
位移量很稳定
无论把网格改成多大,k / N 始终停在 0.618 附近。位移量随像素总数线性增长,所以图片越大,被搬到远处的像素比例几乎不变。