matlab练习程序(Arnold图像置乱)

自从上次写了Hilbert图像置乱之后,就对图像置乱研究了一下,发现这里面也是有很多置乱算法的。

Arnold也算一种比较主要的置乱算法,算法由以下变换公式产生:

这里a和b是参数,n是迭代次数,N是图像的高或宽。

有了正变换公式,我们还需要反变换公式,正好我最近在学Mathematica,反变换公式就是用这个软件求的。

公式如下:

两个变换矩阵正好是求逆的关系吧,手算也出来了,不过顺便熟悉一下Mathematica,何乐不为呢。

处理结果如下:

原图:

matlab练习程序(Arnold图像置乱)

置乱后:

matlab练习程序(Arnold图像置乱)

恢复后:

matlab练习程序(Arnold图像置乱)

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,[])

恢复后图像和原图是一样的。

你可能感兴趣的:(matlab)