Arnold图像置乱的MATLAB实现

这件事情的起因是这样的,我需要研究一下各种图像置乱的算法。然后在知乎上找到了一篇关于Arnold变化的文章,但是呢,这个人实际上是卖资料,代做大作业的。详细的代码根部不给你,则给我气坏了,必须要手动实现一下,打击他卖资料的嚣张气焰。

文章目录

简书上的一个作者写的还是相当不错的,这是网址链接

Arnold 变换是俄国数学家 Vladimir I. Arnold提出的一种变换,一幅 N × N N ×N N×N 的数字图像的二维Arnold
变换定义为:

[ x ′ y ′ ] = [ a b c d ] n [ x y ]   m o d   N \left[\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right]=\left[\begin{array}{ll} a & b \\ c & d \end{array}\right]^{n}\left[\begin{array}{l} x \\ y \end{array}\right] \bmod N [xy]=[acbd]n[xy]modN

注意: x x x y y y 是原图像的像素坐标, x ′ x' x y ′ y' y 是变换后的像素坐标。保证 ∣ a d − b c ∣ = 1 |ad-bc|=1 adbc1,如置换矩阵系数设为 a = b = 1 a=b=1 ab1 c = 2 c=2 c2 d = 3 d=3 d=3,置换次数 n = 20 n=20 n=20,则他们被当作密钥 key,用于解密。Arnold 变换的图像类型只能是 N × N N\times N N×N 的图片。

我从网络上面下载了一朵花的图片,如下

在这里插入图片描述

代码编写

close all;
%图像加密置乱:
a=imread('flower.png');               %取预处理图像
a=a(1:226,1:226,1:3);                 %截取成正方形
R=a(:,:,1);                           %取图像的R层像素
G=a(:,:,2);                           %取图像的G层像素
B=a(:,:,3);                           %取图像的B层像素
figure;
subplot(2,2,1);imshow(a);title('original');
subplot(2,2,2);imshow(R);title('R');
subplot(2,2,3);imshow(G);title('G');
subplot(2,2,4);imshow(B);title('B');

%三个不同密钥
keyR=10;keyG=20;keyB=30;

aR=arnold(R,keyR,1);aG=arnold(G,keyG,1);aB=arnold(B,keyB,1);%对各层用不同的密钥加密
figure;
subplot(2,2,1);imshow(aR);title('aR');%加密后的图像
subplot(2,2,2);imshow(aG);title('aG');
subplot(2,2,3);imshow(aB);title('aB');
aa=cat(3,aR,aG,aB);                            %各层加密后在合成彩色图像
subplot(2,2,4); imshow(aa); title(' Permuted');%RGB图像加密后的结果
imwrite(aa,'a_flower.bmp');

%图像解密
R=arnold(aR,keyR,0);G=arnold(aG,keyG,0);B=arnold(aB,keyB,0);%对各层用不同的密钥加密
R=uint8(R);G=uint8(G);B=uint8(B);
figure;
subplot(2,2,1);imshow(R);title('R');
subplot(2,2,2);imshow(G);title('G');
subplot(2,2,3);imshow(B);title('B');
flower=cat(3,R,G,B);                              %各层加密后在合成彩色图像
subplot(2,2,4); imshow(flower); title('恢复的图案');%RGB图像解密后的结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

arnold.m 是一个单独的函数文件

function img=arnold(img,key,pon)
%img是原始图片
%Key是输入的密钥
%a,b是置乱矩阵里面的值
%pon表示正变换或者反变换
[h, w]=size(img);
a=2;b=3;
img_new = zeros(h,w);  %[h, w]=size(img)
N=h;

if(pon)%正变换
    for i=1:key   %n为置乱轮数
        for y=1:h
            for x=1:w
                xx=mod((x-1)+b*(y-1),N)+1;  %a,b可提前指定
                yy=mod(a*(x-1)+(a*b+1)*(y-1),N)+1;
                img_new(yy,xx)=img(y,x);
            end
        end
        img=img_new;
    end
else%反变换
    for i=1:key
        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  ;
                img_new(yy,xx)=img(y,x);
            end
        end
        img=img_new;
    end
end

周期分析

我现在知道为什么了,因为广义的 Arnold 算法根本没有周期性。

理论上下面的代码是可以计算周期的,但是我跑到了 1 0 7 10^7 107 的数量级,依然没有闭环。等以后如果弄明白了再来讲吧。

%计算Arnold变换的周期T可以利用一下MATLAB程序来实现。

x = 1; y = 1;N = 4; %N × N为128 ×128的图像
T = 1;
t = x; x = x + y; y = 2*t+3*y;
while x~= 1 || y~= 1
    T = T + 1;
    if x >N
        x =mod ( x,N) ;
    end
    if y >N
        y =mod ( y,N) ;
    end
    t = x; x = x + y; y = 2*t+3*y;
end

T %所得的T值即为Arnold变换的周期

猜你喜欢

转载自blog.csdn.net/m0_51143578/article/details/130931870