精华内容
下载资源
问答
  • Arnold变换

    2021-04-13 14:05:35
    Arnold变换又称之为猫脸变换,利用Arnold变换(又称猫脸变换)可以对图像进行置乱。 Arnold变换使得原本有意义的图像变成一张无意义的图像,该变换可以在其它图像处理前对图像做预处理,例如在数字盲水印嵌入前对...

    Arnold变换又称之为猫脸变换,利用Arnold变换(又称猫脸变换)可以对图像进行置乱。

    Arnold变换使得原本有意义的图像变成一张无意义的图像,该变换可以在其它图像处理前对图像做预处理,例如在数字盲水印嵌入前对水印进行置乱。也可以用于普通的图像加密。对于不同的数字图像,加密者都可以用相应的离散化Arnold矩阵进行变换,图像的位置变换实际上是对应点的灰度值或者RGB颜色值的移动,即将原来点(x,y)处的值对应的灰度值移动至变换后的位置处,起到置乱的作用。Arnold变换不仅可以用于图像置乱,也可以用于其它数据的置乱和加密,变换公式如下:

    在这里插入图片描述

    其中mod是取模运算,N是正方形图像的边长,( x’ , y’ )是像素点( x , y )变换后的坐标。

    当图像是一张方形的图像时,Arnold变换存在逆变换,经过N次Arnold变换后的数据可以通过N次逆变换恢复数据,逆变换公式如下:
    在这里插入图片描述

    通常一次Arnold变换达不到理想效果,需要对图像进行连续多次的变换。Arnold变换具有周期性,即对图像连续进行Arnold变换,最终又能得到原图像。变换的周期和图像的尺寸有关,统计如下表:

    表1-1 Arnold变换周期

    边长N 2 4 8 16 32 64 128 246 512 1024
    周期T 3 3 6 12 24 48 96 192 384 768

    变换周期计算代码

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    
    '''
    功能:计算Arnold变换周期,默认为狭义Arnold变换
    参数:
    N--正方形图像宽的像素数
    Arnold变换矩阵参数,a、b、c、d
    '''
    
    def Arnold_period(N,a=1,b=1,c=1,d=2):
      #计算(posx,posy)位置Arnold变换的周期(与整个图像Arnold周期应该一致,待证)
      posx=0
      posy=1
      #变换的初始位置
      x0=posx
      y0=posy
      T=0
      while True:
        x=(a*x0+b*y0)%N
        y=(c*x0+d*y0)%N
        #x0,y0同时更新
        x0,y0=x,y
        T+=1
        if(x==posx and y==posy):
          break
      return T
    
    def main():
      N=[]
      T=[]
      for i in range(1,11):
        N.append(2**i)
        T.append(Arnold_period(2**i,1,1,1,2))
      plt.axis('off')
      #绘制表格展示结果
      data=dict()
      data['N']=N
      data['T']=T
      print(data)
      df=pd.DataFrame(data)
      plt.table(cellText=df.values,colLabels=df.columns,bbox=[0,0,1,1],loc='center')
      plt.show()
    
    
    if __name__== '__main__':
      main()
    
    展开全文
  • arnold变换

    2014-11-13 01:56:10
    基于java的arnold变换,代码简单易懂,对初学者很有帮助
  • 讨论了离散小波变换(DWT)、Arnold变换的基础,分析了它们的特点。给出了一种基于离散小波变换的多分辨率分解的彩色数字水印方法。进行水印嵌入前,利用Arnold变换技术对水印信息进行了加密,保护水印信息,增强了保密性...
  • 内含四道练习,均用Matlab实现。第一道关于经典二维Arnold变换加密的实现;第二,三道关于广义Arnold变换加密和解密的实现;第四道关于更一般的形式变换加密和解密的实现。

    索引

      Arnold 映射定义如下
    (xn+1yn+1)=(1112)(xnyn) mod1\left( \begin{matrix} {{x}_{n+1}} \\ {{y}_{n+1}} \\ \end{matrix} \right)=\left( \begin{matrix} 1 & 1 \\ 1 & 2 \\ \end{matrix} \right)\left( \begin{matrix} {{x}_{n}} \\ {{y}_{n}} \\ \end{matrix} \right)\text{ }\bmod 1
    Arnold映射效果示意图

    1. 将其离散化,应用到图像变换,假设图像大小为N×NN\times N(mn)=(1112)(ij) mod N,i,j=0,1,,N1\left( \begin{matrix} m \\ n \\\end{matrix} \right)\text{=}\left( \begin{matrix} 1 & 1 \\ 1 & 2 \\\end{matrix} \right)\left( \begin{matrix} i \\ j \\\end{matrix} \right)\text{ }\bmod \text{ }N,i,j=0,1,\cdots ,N-1将原始明文图像rice.png中灰度值矩阵II在位置(i,j)(i,j)的灰度值变换为新的置乱矩阵CC在位置(m,n)(m,n)的灰度值,得到一个新的置乱矩阵CC,可视化得到的结果。

    主程序代码 (Problem_1.m)

    % 实现功能:
    % 给定一个明文图像I, 对其进行一轮经典的二维Arnold变换得到置乱矩阵J
    % 并可视化得到的结果
    
    clear; clc;
    I = imread('rice.png');  % 读入图像素材并作为明文图像
    
    % 判断该图像是否符合应用Arnold变换的条件: 图像矩阵是否为方阵
    [row, column] = size(I);
    if row ~= column
        error('明文图像矩阵不是方阵,无法应用Arnold变换进行加密');
    end
    N = row;
    
    % 展示明文图像I
    figure, imshow(I); title('明文图像I');
    
    % 对明文图像I进行一轮二维Arnold变换加密
    J = I;
    for i = 0 : N - 1
        for j = 0 : N - 1
            i1 = mod(i + j, N); j1 = mod(i + 2 * j, N);
            J(i1 + 1, j1 + 1) = I(i + 1, j + 1);
        end
    end
    
    % 对一轮Arnold加密后得到的密文图像J可视化
    figure, imshow(J); title('密文图像C');
    

    结果


    明文图像

    密文图像

    2. 将映射推广为以下的形式(参数p,qp,q选择为0N10\sim N-1之间的整数,可以视作密钥)(mn)=(1pq1+pq)(ij) modN,i,j=0,1,,N1\left( \begin{matrix} m \\ n \\\end{matrix} \right)=\left( \begin{matrix} 1 & p \\ q & 1+pq \\\end{matrix} \right)\left( \begin{matrix} i \\ j \\\end{matrix} \right)\text{ }\bmod N,i,j=0,1,\cdots ,N-1实现置乱加密,设计一个函数m文件,输入变量为密钥p,qp,q,置乱轮数iteriter,以及明文图像II,输出量为密文图像CC,然后在主程序中调用。特别当p=13,q=129p\text{=}13,q\text{=}129,对明文图像rice.png加密3轮得到密文图像CC,显示明文图像和密文图像的直方图,并计算其信息熵。

    广义Arnold变换函数代码 (general_arnoldmap.m)

    function C = general_arnoldmap( I, p, q, iter )
    %% 说明
    % 参数意义
    % I : 输入的明文图像
    % p, q : 构成广义Arnold变换矩阵的密钥
    %        广义Arnold变换矩阵的形式为 A = [ 1, p; q, 1 + p * q ];
    % iter : 置乱轮数
    % C : 输出的密文图像
    %
    % 功能
    %   按照输入的密钥p, q构建广义Arnold变换矩阵A
    %   将输入的明文图像I在A的作用下进行iter轮置乱加密得到密文图像C
    
    %% 输入参数检验
    
    % 检验输入的图像I是否符合应用Arnold变换的前提条件: I是否是方阵
    [row, column] = size(I);
    if row ~= column
        error('输入的明文图像I的矩阵不是方阵, 不适用Arnold变换');
    end
    N = row;
    
    % 检验参数p, q是否为整数
    if floor(p) ~= p
        error('输入的参数p不是一个整数');
    end
    if floor(q) ~= q
        error('输入的参数q不是一个整数');
    end
    
    % 检验输入的置乱轮数iter是否是正整数
    if floor(iter) ~= iter || iter < 1
        error('输入的置乱轮数不是一个正整数');
    end
    
    %% 函数主体
    % 根据输入的p, q构造广义Arnold变换矩阵A
    A = [ 1, p; ...
        q, 1 + p * q ];
    
    % 将输入的明文图像I进行iter轮置乱加密
    C = I;
    for k = 1 : iter
        for i = 0 : N - 1
            for j = 0 : N - 1
                I_pos = [ i; j ];
                C_pos = mod( A * I_pos, N );
                C( C_pos(1) + 1 , C_pos(2) + 1 ) = ...
                    I( I_pos(1) + 1, I_pos(2) + 1 );
            end
        end
        disp(['完成了第', num2str(k), '轮加密']);
        I = C;
    end
    end
    

    主程序代码 (Problem_2.m)

    % 目标任务
    % 设置密钥p = 13, q = 129, 置乱轮数iter = 3
    % 对明文图像I加密3轮得到密文图像C
    % 之后显示明文图像和密文图像的直方图, 并计算其信息熵
    
    clear; clc;
    p = 13;  q = 129;  iter = 3;  % 初始化参数
    I = imread('rice.png');  % 读入明文图像I
    
    C = general_arnoldmap( I, p, q, iter );  % 对I进行广义Arnold变换加密
    
    % 显示明文图像I和密文图像C
    figure, imshow(I); title('明文图像I');
    figure, imshow(C); title('密文图像C');
    
    % 显示明文图像I和密文图像C的灰度直方图
    figure, imhist(I); title('明文图像I的灰度直方图');
    figure, imhist(C); title('密文图像C的灰度直方图');
    if isequal(imhist(I), imhist(C))
        disp('明文图像和密文图像的灰度直方图是一致的');
    else
        disp('明文图像和密文图像的灰度直方图是不一致的');
    end
    
    % 计算信息熵
    disp(['明文图像I的信息熵为: ', num2str(entropy(I))]);
    disp(['密文图像C的信息熵为: ', num2str(entropy(C))]);
    

    作图结果


    明文图像I

    密文图像C

    命令行窗口输出

    完成了第1轮加密
    完成了第2轮加密
    完成了第3轮加密
    明文图像和密文图像的灰度直方图是一致的
    明文图像I的信息熵为: 7.0115
    密文图像C的信息熵为: 7.0115
    

    3. 实现第2题中加密算法的解密算法,同样设计一个函数m文件,输入变量为p,qp,q,置乱轮数iteriter,输出量为密文图像II

    广义Arnold逆变换函数代码 (general_arnoldmap_inv1.m) – 逆矩阵法

    function I = general_arnoldmap_inv1( C, p, q, iter )
    %% 说明
    % 参数意义
    % C: 输入的待解密的密文图像C
    % p, q: 广义Arnold变换涉及的密钥
    %       广义Arnold变换矩阵 A = [ 1, p; q, 1 + p * q ];
    %       其逆变换矩阵为 A_inv = [ 1 + p * q, -p; -q, 1 ];
    % iter: 置乱(解密)轮数
    % I: 输出的解密图像I
    %
    % 功能
    %     按照输入的密钥p, q构造广义Arnold变换逆矩阵A_inv
    %     将输入的密文图像C进行iter轮解密得到明文图像I
    
    %% 输入参数检验
    % 检验输入的密文图像C的图像矩阵是否是方阵
    [row, column] = size(C);
    if row ~= column
        error('输入的密文图像C的图像矩阵不是方阵,不适用Arnold逆变换');
    end
    N = row;
    
    % 检验参数p, q是否为整数
    if floor(p) ~= p
        error('输入的密钥p不是整数');
    end
    if floor(q) ~= q
        error('输入的参数q不是整数');
    end
    
    % 检验解密轮数iter是否为正整数
    if floor(iter) ~= iter || iter < 1
        error('解密轮数iter不是正整数');
    end
    
    %% 函数主体
    % 构造广义Arnold逆变换矩阵
    A_inv = [ 1 + p * q, -p; ...
                -q, 1 ];
    
    % 对密文图像C进行解密得到I
    I = C;
    for k = 1 : iter
        for i = 0 : N - 1
            for j = 0 : N - 1
                C_pos = [ i ; j ];
                I_pos = mod(A_inv * C_pos, N);
                I( I_pos(1) + 1, I_pos(2) + 1 ) = ...
                    C( C_pos(1) + 1, C_pos(2) + 1 );
            end
        end
        disp(['完成了第', num2str(k), '轮解密']);
        C = I;
    end
    
    end
    

    广义Arnold逆变换函数代码 (general_arnoldmap_inv2.m) – 回溯法

    function I = general_arnoldmap_inv2( C, p, q, iter )
    %% 说明
    % 参数意义
    % C: 输入的待解密的密文图像C
    % p, q: 广义Arnold变换涉及的密钥
    %       广义Arnold变换矩阵 A = [ 1, p; q, 1 + p * q ];
    % iter: 置乱(解密)轮数
    % I: 输出的解密图像I
    %
    % 功能
    %     按照输入的密钥p, q构造广义Arnold变换矩阵A
    %     将输入的密文图像C进行iter轮回溯得到明文图像I
    
    %% 输入参数检验
    % 检验输入的密文图像C的图像矩阵是否是方阵
    [row, column] = size(C);
    if row ~= column
        error('输入的密文图像C的图像矩阵不是方阵,不适用Arnold逆变换');
    end
    N = row;
    
    % 检验参数p, q是否为整数
    if floor(p) ~= p
        error('输入的密钥p不是整数');
    end
    if floor(q) ~= q
        error('输入的参数q不是整数');
    end
    
    % 检验解密轮数iter是否为正整数
    if floor(iter) ~= iter || iter < 1
        error('解密轮数iter不是正整数');
    end
    
    %% 函数主体
    % 构造广义Arnold变换矩阵
    A = [1, p; ...
            q, 1 + p * q];
    
    % 对密文图像C进行解密得到I
    I = C;
    for k = 1 : iter
        for i = 0 : N - 1
            for j = 0 : N - 1
                I_pos = [ i ; j ];
                C_pos = mod(A * I_pos, N);
                I( I_pos(1) + 1, I_pos(2) + 1 ) = ...
                    C( C_pos(1) + 1, C_pos(2) + 1 );
            end
        end
        disp(['已完成第', num2str(k), '轮解密']);
        C = I;
    end
    
    end
    

    主程序代码 (Problem_3.m)

    % 目标任务
    % 设置p = 13, q = 129, iter = 3 
    % 对明文图像I0进行广义Arnold变换得到密文图像C
    % 再对密文图像C进行广义Arnold逆变换得到明文图像I
    % 比较I0与解密得到的I是否一致,有无信息缺损
    % 显示I0, C, I的灰度直方图
    % 分别其信息熵
    
    clear; clc;
    p = 13;  q = 129;  iter = 3;  % 初始化参数
    I0 = imread('rice.png');  % 读入图像
    C = general_arnoldmap(I0, p, q, iter);  % 广义Arnold变换
    I = general_arnoldmap_inv1(C, p, q, iter);  
    % I = general_arnoldmap_inv2(C, p, q, iter);  % 广义Arnold逆变换
    if isequal(I0, I)
        disp('广义Arnold逆变换解密得到的图像与原明文图像一致');
    else
        disp('广义Arnold逆变换解密得到的图像与原明文图像不一致');
    end
    
    % 显示图像I0, C, I, 以及相应的灰度直方图
    figure, imshow(I0); title('明文图像I0'); 
    figure, imhist(I0); title('明文图像I0灰度直方图');
    figure, imshow(C); title('密文图像C'); 
    figure, imhist(C); title('密文图像C灰度直方图');
    figure, imshow(I); title('解密图像I'); 
    figure, imhist(I); title('解密图像I灰度直方图');
    
    % 分别计算I0, C, I的信息熵
    disp(['原明文图像I0的信息熵为: ', num2str( entropy(I0) )]);
    disp(['密文图像C的信息熵为: ', num2str( entropy(C) )]);
    disp(['解密得到的图像I的信息熵为: ', num2str( entropy(I) )]);
    

    结果
      明文图像I0I0及其灰度直方图,密文图像CC及其灰度直方图同第2题

    解密图像I

    命令行窗口输出

    完成了第1轮加密
    完成了第2轮加密
    完成了第3轮加密
    完成了第1轮解密
    完成了第2轮解密
    完成了第3轮解密
    广义Arnold逆变换解密得到的图像与原明文图像一致
    原明文图像I0的信息熵为: 7.0115
    密文图像C的信息熵为: 7.0115
    解密得到的图像I的信息熵为: 7.0115
    

    4. 将变换推广到更一般的情况:(mn)=(abcd)(ij) modN,i,j=0,1,,N1\left( \begin{matrix} m \\ n \\\end{matrix} \right)=\left( \begin{matrix} a & b \\ c & d \\\end{matrix} \right)\left( \begin{matrix} i \\ j \\\end{matrix} \right)\text{ }\bmod N,i,j=0,1,\cdots ,N-1其中变换矩阵的系数在0,1,,N10,1,\cdots ,N-1中选取,其行列式adbcad-bc满足与NN互质即可实现变换的可逆性。 假设图像大小为N×N=256×256N\times N=256\times 256,用(mn)=(1211037217)(ij) modN,i,j=0,1,,N1\left( \begin{matrix} m \\ n \\\end{matrix} \right)\text{=}\left( \begin{matrix} 121 & 10 \\ 37 & 217 \\\end{matrix} \right)\left( \begin{matrix} i \\ j \\\end{matrix} \right)\text{ }\bmod N,i,j=0,1,\cdots ,N-1实现rice.png的一轮加密和解密。

    一般加密算法函数代码 (general_encryption.m)

    function C = general_encryption( I, M, iter )
    %% 说明
    % 参数意义
    % I : 输入的明文图像
    % M : 输入的变换矩阵
    % iter : 输入的变换轮数
    % C : 输出的密文图像
    %
    % 功能
    % 对输入的明文图像I在变换矩阵M的作用下加密iter轮得到密文图像C
    
    %% 检验输入的参数
    
    % 检验输入的明文图像是否是方阵
    [row, column] = size(I);
    if row ~= column
        error('输入的明文图像不是一个方阵');
    end
    N = row;
    
    % 检验加密轮数iter是否为正整数
    if floor(iter) ~= iter || iter < 1
        error('输入的加密轮数iter不是一个正整数');
    end
    
    % 对输入的变换矩阵进行检验
    % 检验M是否是 2*2 矩阵
    [row, column] = size(M);
    if row ~= 2 || column ~= 2
        error('输入的变换矩阵不是2*2的方阵');
    end
    % 检验M中的四个元素是否均为实整数
    if ~isreal(M) || ismember(1, floor(M) ~= M)
        error('输入的变换矩阵存在非实整数的元素');
    end
    % 检验M的行列式是否与N互素(互素时变换才可逆, 才能进行解密)
    if gcd( det(M), N ) ~= 1
        error('输入的变换矩阵对应的置乱变换不可逆');
    end
    
    %% 函数主体
    C = I;
    for k = 1 : iter
        for i = 0 : N - 1
            for j = 0 : N - 1
                I_pos = [ i ; j ];
                C_pos = mod( M * I_pos, N );
                C( C_pos(1) + 1, C_pos(2) + 1 ) = ...
                    I( I_pos(1) + 1, I_pos(2) + 1 );
            end
        end
        disp(['已完成第', num2str(k), '轮加密']);
        I = C;
    end
    end
    

    一般解密算法函数代码 (general_decryption.m)

    function I = general_decryption( C, M, iter )
    %% 说明
    % 参数意义
    % C : 输入的密文图像
    % M : 输入的加密变换矩阵
    % iter : 输入的变换轮数
    % I : 输出的明文图像
    %
    % 功能
    % 对输入的密文图像C,根据变换矩阵M的信息,解密iter轮得到结果I
    
    %% 检验输入的参数
    
    % 检验输入的明文图像是否是方阵
    [row, column] = size(C);
    if row ~= column
        error('输入的密文图像不是一个方阵');
    end
    N = row;
    
    % 对输入的变换矩阵进行检验
    % 检验M是否是 2*2 矩阵
    [row, column] = size(M);
    if row ~= 2 || column ~= 2
        error('输入的变换矩阵不是2*2的方阵');
    end
    % 检验M中的四个元素是否均为实整数
    if ~isreal(M) || ismember(1, floor(M) ~= M)
        error('输入的变换矩阵存在非实整数的元素');
    end
    % 检验M的行列式是否与N互素(互素时变换才可逆, 才能进行解密)
    if gcd( det(M), N ) ~= 1
        error('输入的变换矩阵对应的加密置乱变换不可逆');
    end
    
    %% 函数主体
    I = C;
    for k = 1 : iter
        for i = 0 : N - 1
            for j = 0 : N - 1
                I_pos = [ i ; j ];
                C_pos = mod( M * I_pos, N );
                I( I_pos(1) + 1, I_pos(2) + 1 ) = ...
                    C( C_pos(1) + 1, C_pos(2) + 1 );
            end
        end
        disp(['已完成第', num2str(k), '轮解密']);
        C = I;
    end
    end
    

    主程序代码 (Problem_4.m)

    % 目标任务
    % 给定一个变换矩阵M和置乱轮数iter
    % 对明文图像I0进行加密得到密文图像C
    % 再对密文图像C解密得到I
    % 比较I0与I是否一致
    
    clear; clc;
    M = [ 121, 10; 37, 217 ];  % 设置变换矩阵
    iter = 1;  % 设置置乱轮数
    I0 = imread('rice.png');  % 读入图片
    C = general_encryption(I0, M, iter);
    I = general_decryption(C, M, iter);
    
    % 比对I0与I是否一致
    if isequal(I0, I)
        disp('明文图像I0与解密得到的结果I是一致的');
    else
        disp('明文图像I0与解密得到的结果I是不一致的');
    end
    
    % 展示I0, C, I
    figure, imshow(I0); title('明文图像I0');
    figure, imshow(C); title('密文图像C');
    figure, imshow(I); title('解密图像I');
    

    结果


    明文图像I0

    密文图像C

    解密图像I

    命令行窗口输出

    已完成第1轮加密
    已完成第1轮解密
    明文图像I0与解密得到的结果I是一致的
    

    展开全文
  • 讨论了离散小波变换(DWT)、Arnold变换的基础,分析了它们的特点。给出了一种基于离散小波变换的多分辨率分解的彩色数字水印方法。进行水印嵌入前,利用rnold变换技术对水印信息进行了加密,保护水印信息,增强了保密...
  • Arnold 变换程序

    2012-12-18 23:01:49
    Arnold 变换的典型算法, Matlab程序。
  • Arnold变换是Arnold在遍历理论研究中提出的一种变换。由于Arnold本人最初对一张猫的图片进行了此种变换,因此它又被称为猫脸变换。Arnold变换可以对图像进行置乱,使得原本有意义的图像变成一张无意义的图像。经典...

    Arnold变换是Arnold在遍历理论研究中提出的一种变换。由于Arnold本人最初对一张猫的图片进行了此种变换,因此它又被称为猫脸变换。Arnold变换可以对图像进行置乱,使得原本有意义的图像变成一张无意义的图像。经典Arnold变换是一个二维可逆映射,但离散形式的Arnold变换具有周期性随着图像大小的变化而变化。

    定义1 称整数到自身的变换

     

     

    ,其中为二维Arnold变换。

    定义2  称整数到自身的变换,其中

     

     

    为二维Arnold逆变换。

        设为图像上的点,在Arnold变换下变成点,因此,使用Arnold变换可以实现图像位置的变换。但是当时,Arnold变换不适合的图像。

    对经典Arnold变换的矩阵A进行替换,可以得到广义Arnold变换。

    转载于:https://www.cnblogs.com/fanglijiao/p/11543193.html

    展开全文
  • Arnold变换+Java实现

    千次阅读 2017-04-04 16:33:11
    编程实现Arnold变换1.概念Arnold变换是由Arnold提出的一种变换,也称猫变换、猫映射。目前Arnold变换主要用于图像置乱。该变换可以在其它图像处理前对图像做预处理,例如在数字盲水印嵌入前对水印进行置乱。也可以...

    在这里插入图片描述

    一、预备知识

    1. Arnold变换概念

    Arnold变换是由Arnold提出的一种变换,也称猫变换、猫映射。目前Arnold变换主要用于图像置乱。该变换可以在其它图像处理前对图像做预处理,例如在数字盲水印嵌入前对水印进行置乱。也可以用于普通的图像加密。

    2. 正变换

    (x′y′)=[1112](xy) mod (N)\left(\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right)=\left[\begin{array}{ll} 1 & 1 \\ 1 & 2 \end{array}\right]\left(\begin{array}{l} x \\ y \end{array}\right) \bmod (N)(xy)=[1112](xy)mod(N)

    对于规模为NXN正方形数字图像来说,我们将图像的所有像素集合看作一个NXN的矩阵。在Arnold变换中,设该矩阵中的任意像素位置为(x,y)(x,y)(x,y),将像素点(x,y)(x,y)(x,y)按照某种映射变换到另一点(x′,y′)(x',y')(x,y)

    转换过后,得到如下对应的多项式:

    {x′=(x+y) mod (N)y′=(x+2y) mod (N)\left\{\begin{array}{l} x^{\prime}=(x+y) \bmod (N) \\ y^{\prime}=(x+2 y) \bmod (N) \end{array}\right.{x=(x+y)mod(N)y=(x+2y)mod(N)

    3. 逆变换

    相当于改变变换矩阵,得到:

    (xy)=[2−1−11](x1y′) mod (N)\left(\begin{array}{l} x \\ y \end{array}\right)=\left[\begin{array}{cc} 2 & -1 \\ -1 & 1 \end{array}\right]\left(\begin{array}{l} x_{1} \\ y_{\prime} \end{array}\right) \bmod (N)(xy)=[2111](x1y)mod(N)

    转换为多项式后对应关系:
    {x=2x′−y′ mod (N)y=−x′+y′ mod (N)\left\{\begin{array}{l} x=2 x^{\prime}-y^{\prime} \bmod (N) \\ y=-x^{\prime}+y^{\prime} \bmod (N) \end{array}\right.{x=2xymod(N)y=x+ymod(N)

    当变换矩阵为如上的两种矩阵时,变换被称为狭义的Arnold变换,若变换公式为:
    (x′y′)=[1abab+1](xy) mod (N)\left(\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right)=\left[\begin{array}{cc} 1 & a \\ b & a b+1 \end{array}\right]\left(\begin{array}{l} x \\ y \end{array}\right) \bmod (N)(xy)=[1baab+1](xy)mod(N)
    或者为:
    (xy)=[ab+1−a−b1](x′y′) mod (N)\left(\begin{array}{l} x \\ y \end{array}\right)=\left[\begin{array}{cc} a b+1 & -a \\ -b & 1 \end{array}\right]\left(\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right) \bmod (N)(xy)=[ab+1ba1](xy)mod(N)
    那么此时变换被称为广义的Arnold变换

    4. 周期性

    Arnold变换具有周期性

    对于数字图像而言,我们仅仅是对图像中像素的位置进行了改变而没有改变其值,如果我们对数字图像迭代地使用Arnold变换,即,将输出作为下一次猫映射的输入,那么迭代一定轮数,图像就会出现置乱的效果。

    下图是以256X256的lena灰度图像为例,经过192次迭代后,每轮为迭代,图像经过192次变换后恢复了原图像:

    这里写图片描述

    二、Java实现

     public static void arnoldTransform(File srcImageFile, File desImageFile, int period) { 
        	
       	 BufferedImage srcImage = null;  
         try {  
           	 srcImage = ImageIO.read(srcImageFile);  
         } catch (IOException e) {  
        	 e.printStackTrace();  
         }   
         int width = srcImage.getWidth();  
         int height = srcImage.getHeight(); 
         
         BufferedImage desImage = null;
         if (width != height) {  
        	 System.out.println("此图像不符合要求N x N!"); 
         } 
         else {  
    	     int[][] imageMatrix = new int[height][width];  
    	     //获取图像每个像素的RGB值
    	     for(int i = 0; i < height; i++) {  
    	    	 for (int j = 0; j < width; j++) {  
    	    		 imageMatrix[i][j] = srcImage.getRGB(i, j);  
    	         }  
    	     }  
    	     int N = width;  
    	     int[][] srcMatrix = imageMatrix;  
    	     int[][] desMatrix = new int[N][N];  
    	     desImage = new BufferedImage(width, height, srcImage.getType());      
    	     for (int n = 0; n < period; n++) {  
    	    	 if (n != 0) {  
    	    		 srcMatrix = desMatrix;  
    	             desMatrix = new int[N][N];  
    	         }  
    		     for (int i = 0; i < N; i++) {  
    		    	 for (int j = 0; j < N; j++) {  
    		    		 desMatrix[(i + j) % N][(i + 2 * j) % N] = srcMatrix[i][j];  
    		         }  
    		     }  
    	     }       
    	     for (int i = 0; i < N; i++) {  
    	         for (int j = 0; j < N; j++) {  
    	             desImage.setRGB(i, j, desMatrix[i][j]);  
    	         }  
    	     		}  
         }  
         try {  
              ImageIO.write(desImage, "jpg", desImageFile);  
         } catch (IOException e) {  
              e.printStackTrace();  
         }  
     
       }  
    
    展开全文
  • Arnold变换是一种常见的图像置乱技术,Arnold变换定义如下: //对任意NN矩阵(素有元素相同的矩阵除外)设i,j为矩阵元素的初始下标,经过Arnold变换后行下标为i’,j’,其满足下式: i’=(i+j)mod N  j’=(i+2j)mod...
  • 提出了用于MXN数字图像的二维Arnold变换公式,指出其变换周期等于MAXNXMAXN(其中MAXN=MAX(M,N))数字图像Arnold变换的周期;分析了二维Arnold变换用于数字图像加密的弊端,针对于其不足,提出将Arnold变换用于置乱虚拟...
  • arnold变换源代码

    热门讨论 2010-04-22 17:22:35
    Arnold变换是Arnold遍历理论研究中提出的一种变换,俗称猫脸变换,设想在平面单位正方形内绘制一个猫脸图像,这个猫脸图像将逐渐由清晰变模糊,即是猫脸变换。 Arnold变换是对图像中的像素点坐标做变换,当遍布了...
  • 提出一种基于离散余弦变换(DCT)和Arnold变换的数字水印算法。该算法首先使用Arnold变换对水印图像进行置乱预处理,然后对载体图像进行8×8的离散余弦变换,根据预处理后的水印像素值,调整 DCT系数的大小关系。算法...
  • 您必须知道 Arnold 变换仅针对正方形定义。 如果你想在矩形中使用它,你必须首先添加空行或空行来制作正方形。 屏幕截图表示变换及其逆的 5 次交互。 此实现不会像您在文件交换中找到的其他实现那样移动图像。 实现...
  • //Arnold变换是一种常见的图像置乱技术,Arnold变换定义如下: //对任意N*N矩阵(素有元素相同的矩阵除外)设i,j为矩阵元素的初始下标,经过Arnold变换后行下标为i',j',其满足下式 //i'=(i+j)mod N //j =(i+2j)mod N...
  • 图像加密陈氏超混沌系统和Arnold变换是经常要用到的代码
  • Arnold变换代码

    2009-03-28 23:00:34
    Arnold变换是图像加密常用的一种置乱方法,它通过改变像素的位置,从而达到使图像加密的目的。
  • MATLAB 实现Arnold变换

    2009-01-13 17:23:23
    MATLAB 实现Arnold变换 数字图像保密通信
  • 图像加密:改进的广义离散arnold变换和非线性混沌图
  • arnold变换主要是一种混沌映射,但其具有周期性,该代码主要计算arnold变换的周期。
  • 原文地址:... Arnold变换 Arnold变换是V.J.Arnold在遍历理论的研究中提出的一种变换,原意为catmapping,俗称猫脸变换。Arnold变换直观、简单、具有周期性,使用非常方便。Arnold变换的原理是先作x...
  • 针对二值图像的特点,讨论了二维Arnold变换在二值图像置乱中的置乱周期问题,提出一种快速Arnold变换策略,即少点置乱法,分析比较Arnold逆变换方法,针对一步恢复原图中直接求矩阵乘方会产生当矩阵元素过大超出运算...
  • 再使用Arnold变换对数据的嵌入顺序进行置乱,防止攻击者按顺序分析出秘密信息,使秘密信息的隐蔽性变高,进而提高了算法的安全性。实验结果表明本算法提高了隐写的隐蔽性,减少了图像的嵌入失真度,且随机非满嵌操作...
  • 在充分考虑映射的混沌特性以及图像相那像素间强相关性的基础上,提出基于Arnold变换和混沌理论的图像加密算法。具体的操作过程中,首先利用Arnold变换对图像进行全局置乱处理,然后利用Tent映射对置换后的图像进行混沌...
  • Arnold变换解法

    千次阅读 2010-04-11 17:37:00
    Arnold变换是一种常用的图像置乱技术,Arnold变换的定义如下:对任意N*N矩阵(所有元素都相同的矩阵除外),设i,j为矩阵元素原始下标,经过Arnold变换后新下标为i,j,且满足下式:i=(i+j)mod Nj=(i+2j)mod Ni,j:0,...
  • Arnold变换置乱图像

    万次阅读 2016-10-13 10:18:34
    Arnold变换是俄国数学家弗拉基米尔·阿诺德(Vladimir Igorevich Arnold)提出,Arnold将其应用在遍历理论研究中。由于Arnold本人最初对一张猫的图片进行了此种变换,因此它又被称为猫脸变换(cat映射)。Cat映射...
  • 为了减小参与者的负担,本文基于布尔运算提出了一种像素缩小的(2n,2n)秘密共享方案,该方案通过Arnold变换和加密算法将一幅图像共享成2n幅大小为原图像1/2n的分存图像,只有所有分存图像共同存在时才能够无质量损失地...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 241
精华内容 96
关键字:

arnold变换