Arnold置亂

3cH0_Nu1L發表於2023-04-26

一、Arnold置亂概述

  Arnold變換是俄國數學家弗拉基米爾·阿諾德(Vladimir Igorevich Arnold)提出,Arnold將其應用在遍歷理論研究中。由於Arnold本人最初對一張貓的圖片進行了此種變換,因此它又被稱為貓臉變換(cat對映)。Cat對映可以把影像中各畫素點的位置進行置換,使其達到加密的目的,多應用在多媒體混沌加密中。

  Arnold置亂是一種數字影像處理技術,透過改變影像畫素的排列順序來產生視覺上的扭曲和變形效果。該技術主要應用於影像加密和保護,也可以用於生成藝術效果或增加影像的複雜度。

  Arnold置亂的原理基於置換群的概念。對於一個n×n的影像,可以將其視為一個由n²個畫素組成的向量。Arnold置亂透過一系列置換操作來改變這些向量的排列順序,從而產生不同的視覺效果。

  具體來說,Arnold置亂的操作是將每個畫素座標(x, y)進行置換操作,得到新的座標(x', y')。置換操作的具體方法如下:

    x' = (ax + y) mod n y' = (bx + (a*b+1)*y) mod n

  其中,a和b是兩個置亂引數,n是影像大小。上述公式可以理解為將(x, y)對映到了一個新的座標(x', y')。透過反覆進行這樣的置換操作,可以將影像畫素的排列順序進行混亂,從而產生視覺上的扭曲和變形效果。

  值得注意的是,Arnold置亂是一種可逆操作,也就是說可以透過相反的操作將影像恢復為原始狀態。具體來說,如果知道了置亂引數a和b以及進行置亂的迭代次數n,就可以對影像進行反向置亂操作,從而得到原始的影像。

  在實際應用中,Arnold置亂常常被用於數字水印、影像加密等領域。透過對影像進行多次Arnold置亂操作,可以使得影像的畫素排列變得非常複雜和隨機,從而增加了影像的安全性和保密性。同時,Arnold置亂也可以用於生成藝術效果,例如在數字藝術中用於產生視覺上的扭曲和變形效果。

二、步驟

  Arnold置亂的具體步驟如下:

  1. 選擇置亂引數a和b:Arnold置亂的第一步是選擇兩個置亂引數a和b,這兩個引數是用來控制畫素排列順序的。一般情況下,選擇兩個互質的正整數作為置亂引數,例如a=3,b=5。

  2. 將影像轉換為矩陣:將要加密的影像轉換為一個n×n的矩陣,其中n為矩陣的行數和列數。如果影像大小不是n的整數倍,則可以在影像邊緣進行填充或截斷操作。

  3. 進行置亂操作:對於影像矩陣中的每個畫素座標(x, y),使用下面的公式進行置亂操作:

    x' = (ax + y) mod n y' = (bx + (a*b+1)*y) mod n

    其中,(x', y')就是置亂後的畫素座標。這個過程就是將影像畫素的位置進行混亂和扭曲。

  4. 重複置亂操作:對於置亂後的畫素座標(x', y'),再次使用上述公式進行置亂操作,得到新的畫素座標(x'', y'')。重複進行這樣的操作,直到達到預設的置亂次數。

  5. 將置亂後的畫素矩陣轉換回影像:將置亂後的畫素矩陣重新轉換為影像,並儲存加密後的影像檔案。如果需要對影像進行解密,則需要進行相反的置亂操作。

三、程式碼實現

1.MATLAB實現置亂

Arnold置亂
% 定義置亂引數
a = 3;
b = 5;
t = 512;

% 載入要置亂的影像
img = imread('Lena.png');

% 將影像轉換為灰度影像
img_gray = rgb2gray(img);

% 將灰度影像轉換為矩陣
img_matrix = double(img_gray);

% 獲取矩陣的行數和列數
[n, m] = size(img_matrix);

% 對影像進行置亂操作
for k = 1:t % 設定置亂次數為10次
    for i = 1:n
        for j = 1:m
            x = mod(a*i + j, n) + 1;
            y = mod(b*i + (a*b+1)*j, n) + 1;
            img_matrix(x, y) = img_gray(i, j);
        end
    end
end

% 將置亂後的矩陣轉換回影像
img_scrambled = uint8(img_matrix);

% 輸出Arnold置亂後的影像
imshow(img_scrambled);

% 儲存置亂後的影像
imwrite(img_scrambled, 'Lena_scrambled.jpg');
Code_01
Arnold置亂
% 讀取原始影像並轉換為灰度影像
img = imread('Lena.png');
img = rgb2gray(img);

% 定義Arnold置亂的引數
n = 512;
a = 3;
b = 5;

% 進行n次Arnold置亂迭代
for k = 1:n
    % 將影像分成大小為n×n的塊
    blocks = mat2cell(img, repmat(n, 1, size(img, 1)/n), repmat(n, 1, size(img, 2)/n));
    for i = 1:size(blocks, 1)
        for j = 1:size(blocks, 2)
            % 對於每個塊,進行Arnold置亂操作
            block = blocks{i,j};
            [x, y] = meshgrid(1:n, 1:n);
            x1 = mod(a*x + y, n) + 1;
            y1 = mod(b*x + (a*b+1)*y, n) + 1;
            idx = sub2ind([n, n], y1(:), x1(:));
            block = reshape(block(idx), n, n);
            blocks{i,j} = block;
        end
    end
    % 合併所有塊並更新影像
    img = cell2mat(blocks);
end

% 輸出Arnold置亂後的影像
imshow(img);
Code_02

2.MATLAB實現逆置亂

Arnold置亂
clear all;
clc;

% 讀取圖片,根據Arnold變換的條件,影像必須是正方形
img=imread('Lena.bmp');

% 當只有一個輸出引數時,返回一個行向量,該行向量的第一個元素時矩陣的行數,第二個元素是矩陣的列數。
mysize=size(img);

if numel(mysize)>2%如果輸入是彩色影像
    img=rgb2gray(img); %將彩色到灰度影像的轉換
    fprintf("影像為彩色圖\n");
else
    fprintf("影像為灰度圖\n");
end

imshow(img,[])
title('彩色原圖的灰度圖');

figure(2)
imhist(img)    %原圖的直方圖統計

%如果輸入的不是正方形影像,則列印如下
[h,w]=size(img);
if h>w
    img = imresize(img, [w w]);
    fprintf("影像長寬不一樣,影像可能失真\r");
end
if h<w
    img = imresize(img, [h h]);
    fprintf("影像長寬不一樣,影像可能失真");
end
[h,w]=size(img);

% 置亂與逆置亂必須採用共同引數的時候,就相當於密碼,才能解密,讓影像復原
% 迭代次數
n=10;
a=1;b=1;
N=h;%N代表影像寬高,寬高要一樣

%% 置亂操作
imgnnn=zeros(h,w);
for i=1:n
    for y=1:h
        for x=1:w
            xx=mod((x-1)+b*(y-1),N)+1;   %mod取餘操作,(a,b)就是a除以b的餘數
            yy=mod(a*(x-1)+(a*b+1)*(y-1),N)+1;
            imgnnn(yy,xx)=img(y,x);
        end
    end
    img=imgnnn;
end
imgnnn = uint8(imgnnn);

figure(3)
imshow(img,[])%置亂後的圖片
title('置亂後的圖片 a=1;b=1,n=10');
imwrite (imgnnn,'置亂後的圖片.bmp');  %生成影像儲存功能

%% 逆置亂復原
img2=imread('置亂後的圖片.bmp');%讀取置亂圖片
for i=1:n
    for y=1:h
        for x=1:w
            xx=mod((a*b+1)*(x-1)-b*(y-1),N)+1;%matlab索引中不能是0,要從1開始
            yy=mod(-a*(x-1)+(y-1),N)+1  ;
            imgnnn(yy,xx)=img2(y,x);
        end
    end
    img2=imgnnn;
end
imgnnn = uint8(imgnnn);
figure(4)
imshow(imgnnn,[])
title('逆置亂的復原圖片');
imwrite(imgnnn,'逆置亂的復原圖片.bmp');%生成影像儲存功能
Code_03

  在上面的程式碼中,我們首先定義了置亂引數a和b,然後載入了一張名為lena.jpg的影像,並將其轉換為灰度影像。接下來,我們將灰度影像轉換為一個n×n的矩陣,然後使用兩重迴圈對每個畫素進行置亂操作。在置亂操作中,我們使用了上面描述的公式進行畫素座標的計算和調換。最後,我們將置亂後的矩陣再次轉換為影像,並儲存到名為lena_scrambled.jpg的檔案中。

四、二維Arnold置亂

二維Arnold置亂是一種將二維影像進行混沌置亂的方法,與一維Arnold置亂類似,它也是透過改變畫素座標的排列順序來實現影像混沌化的。

二維Arnold置亂的具體步驟如下:

  1. 選擇置亂引數a和b:同樣,二維Arnold置亂的第一步是選擇兩個置亂引數a和b,這兩個引數是用來控制畫素排列順序的。一般情況下,選擇兩個互質的正整數作為置亂引數,例如a=3,b=5。

  2. 將影像轉換為矩陣:同樣地,將要加密的影像轉換為一個n×n的矩陣,其中n為矩陣的行數和列數。

  3. 進行置亂操作:對於影像矩陣中的每個畫素座標(x, y),使用下面的公式進行置亂操作:

    x' = (ax + y) mod n y' = (bx + (a*b+1)*y) mod n

    其中,(x', y')就是置亂後的畫素座標。這個過程就是將影像畫素的位置進行混亂和扭曲。

  4. 重複置亂操作:對於置亂後的畫素座標(x', y'),再次使用上述公式進行置亂操作,得到新的畫素座標(x'', y'')。重複進行這樣的操作,直到達到預設的置亂次數。

  5. 將置亂後的畫素矩陣轉換回影像:將置亂後的畫素矩陣重新轉換為影像,並儲存加密後的影像檔案。如果需要對影像進行解密,則需要進行相反的置亂操作。

總之,二維Arnold置亂是一種可靠的影像混沌化方法,它可以增強影像的安全性和保密性。

 

相關文章