Arnold變換
Arnold 變換,又稱“貓臉”變換,是 Arnold在研究遍歷理論過程中提出的一種變換。
一般用
來做變換。
稍加證明可知,該映射是雙射,其逆變換爲
該變換是合理的。
稍加思考可知,Arnold變換具有週期性,即當迭代到某一步時,將從新得到原始圖像。選取適當的迭代次數才能得到較好的置亂圖。當迭代次數較多時,不宜一步步去算,可先矩陣快速冪求出
再對原圖像進行置亂。
講道理,爲啥一定要是正方形呢?
直覺告訴問我,不是正方形,不能保證雙射,就不能還原了。
原圖->40次迭代->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