Arnold变换+Java实现

    xiaoxiao2021-03-25  95

    一、预备知识

    1. Arnold变换概念

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

    2. 正变换

    ( x ′ y ′ ) = [ 1 1 1 2 ] ( x y )   m o d   ( 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 )   m o d   ( N ) y ′ = ( x + 2 y )   m o d   ( 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. 逆变换

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

    ( x y ) = [ 2 − 1 − 1 1 ] ( x 1 y ′ )   m o d   ( 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 = 2 x ′ − y ′   m o d   ( N ) y = − x ′ + y ′   m o d   ( 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 ′ ) = [ 1 a b a b + 1 ] ( x y )   m o d   ( 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) 或者为: ( x y ) = [ a b + 1 − a − b 1 ] ( x ′ y ′ )   m o d   ( 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(); } }
    转载请注明原文地址: https://ju.6miu.com/read-10997.html

    最新回复(0)