图像置乱

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_25884463/article/details/52463788

Arnold变换

Arnold 变换,又称“猫脸”变换,是 Arnold在研究遍历理论过程中提出的一种变换。

一般用

(xy)=(1112)(xy)modN

来做变换。

稍加证明可知,该映射是双射,其逆变换为

(xy)=(2111)(xy)modN

该变换是合理的。

稍加思考可知,Arnold变换具有周期性,即当迭代到某一步时,将从新得到原始图像。选取适当的迭代次数才能得到较好的置乱图。当迭代次数较多时,不宜一步步去算,可先矩阵快速幂求出

(1112)k

再对原图像进行置乱。

讲道理,为啥一定要是正方形呢?
直觉告诉问我,不是正方形,不能保证双射,就不能还原了。
原图原图->40次迭代40次迭代->90次迭代90次迭代

看上去,40次迭代效果最好。

如何快速找到较好迭代次数,是有待讨论的问题。
matlab的速度惨不忍睹,实在有必要引入c++了

function new_fig = Arnold(fig,k,opt)

% Arnold变换
% 输入:图像矩阵fig(n*m*k),置乱次数k,操作类型opt(1是置乱,2是还原)
% 输出:置乱后的图像矩阵new_fig(n*m*k)

new_fig = uint8(zeros(size(fig)));
n = size(fig,1);
if opt == 1
    A = fast_pow([1 1; 1 2],k,n);
else
    A = fast_pow([2 -1; -1 1],k,n);
end

for i = 1 : n
    for j = 1 : n
        t = mod(A*[i-1;j-1],n)+1;
        new_fig(t(1),t(2),:) = fig(i,j,:);
    end
end
展开阅读全文

没有更多推荐了,返回首页