自從上次寫了Hilbert圖像置亂之后,就對圖像置亂研究了一下,發現這里面也是有很多置亂算法的。
Arnold也算一種比較主要的置亂算法,算法由以下變換公式產生:
這里a和b是參數,n是迭代次數,N是圖像的高或寬。
有了正變換公式,我們還需要反變換公式,正好我最近在學Mathematica,反變換公式就是用這個軟件求的。
公式如下:
兩個變換矩陣正好是求逆的關系吧,手算也出來了,不過順便熟悉一下Mathematica,何樂不為呢。
處理結果如下:
原圖:
置亂后:
恢復后:
matlab代碼如下:
clear all;close all;clc; img=imread('lena.jpg'); imshow(img,[]) [h w]=size(img); %置亂與復原的共同參數 n=10; a=3;b=5; N=h; %置亂 imgn=zeros(h,w); for i=1:n for y=1:h for x=1:w xx=mod((x-1)+b*(y-1),N)+1; yy=mod(a*(x-1)+(a*b+1)*(y-1),N)+1; imgn(yy,xx)=img(y,x); end end img=imgn; end figure; imshow(imgn,[]) %復原 img=imgn; for i=1:n for y=1:h for x=1:w xx=mod((a*b+1)*(x-1)-b*(y-1),N)+1; yy=mod(-a*(x-1)+(y-1),N)+1 ; imgn(yy,xx)=img(y,x); end end img=imgn; end figure imshow(imgn,[])
恢復后圖像和原圖是一樣的。