Arnold變換詳解

1. 概述

利用Arnold變換(又稱貓臉變換)可以對(duì)圖像進(jìn)行置亂劫映,使得原本有意義的圖像變成一張無(wú)意義的圖像诡必。該變換可以在其它圖像處理前對(duì)圖像做預(yù)處理吭产,例如在數(shù)字盲水印嵌入前對(duì)水印進(jìn)行置亂格二。也可以用于普通的圖像加密。
通常一次Arnold變換達(dá)不到理想效果齿诉,需要對(duì)圖像進(jìn)行連續(xù)多次的變換筝野。Arnold變換具有周期性,即對(duì)圖像連續(xù)進(jìn)行Arnold變換粤剧,最終又能得到原圖像歇竟。變換的周期和圖像的尺寸有關(guān)。
當(dāng)圖像是一張方形的圖像時(shí)抵恋,Arnold變換存在逆變換焕议。經(jīng)過(guò)N次Arnold變換后的數(shù)據(jù)可以通過(guò)N次逆變換恢復(fù)數(shù)據(jù)。
Arnold變換不僅可以用于圖像置亂弧关,也可以用于其它數(shù)據(jù)的置亂和加密盅安。

2. 狹義的貓臉變換

2.1 公式

狹義的貓臉變換即最簡(jiǎn)單的一種變換。網(wǎng)絡(luò)上絕大部分關(guān)于Arnold變換的博客都是狹義Arnold變換世囊。
其矩陣運(yùn)算公式為:

狹義貓臉變換矩陣公式

轉(zhuǎn)化為多項(xiàng)式為:
狹義貓臉變換多項(xiàng)式公式

其中mod()是取模運(yùn)算别瞭,N是正方形圖像的邊長(zhǎng),(x', y')是像素點(diǎn)(x, y)變換后的坐標(biāo)茸习。
注意求模運(yùn)算(mod) ≠ 求余運(yùn)算(%) 畜隶。在被除數(shù)是負(fù)數(shù)時(shí)兩者存在差別,例如: -5 mod(6) = 1, 但 -5 % 6 = -5号胚。

/**
 * 求模運(yùn)算
 */
private int mod(int number, int mod) {
    return (number % mod + mod) % mod;
}

2.2 物理意義和示意圖

置亂的實(shí)質(zhì)是新位置與舊位置的映射籽慢,且該映射是一一對(duì)應(yīng)的。下圖是一次貓臉變換的示意圖:

狹義貓臉變換示意圖

  • (a)是原圖
  • (b)是先做水平方向的錯(cuò)切
  • (c)是在(b)的基礎(chǔ)上再做一次豎直方向的錯(cuò)切
  • (d)是對(duì)圖像求模猫胁,即切割回填操作箱亿,得到變換后的圖像。

如果你想知道為什么要這樣變換弃秆,為什么是水平錯(cuò)切一個(gè)單位届惋,豎直錯(cuò)切兩個(gè)單位:
實(shí)際上這里水平錯(cuò)切的長(zhǎng)度是一倍圖像的高度,豎直錯(cuò)切的長(zhǎng)度是一倍圖像的高度加一倍圖像的寬度菠赚。由于圖像的寬高相等脑豹,所以這里看起來(lái)是水平錯(cuò)切一個(gè)單位,豎直兩個(gè)單位衡查。
為什么這樣子錯(cuò)切瘩欺,是因?yàn)?strong>置亂的實(shí)質(zhì)是新位置與舊位置的映射,且該映射是一一對(duì)應(yīng)的。
也就是說(shuō)俱饿,其它錯(cuò)切形式可能造成多個(gè)點(diǎn)移動(dòng)到同一個(gè)位置歌粥,導(dǎo)致圖像信息的丟失。例如下面兩種錯(cuò)切方式:

其他錯(cuò)切情形

第一種是水平和豎直方向都錯(cuò)切一個(gè)單位拍埠,第二種是水平一個(gè)單位失驶,豎直三個(gè)單位≡婀海可以看出嬉探,取模后兩種錯(cuò)切方式都有部分區(qū)域重疊了。因此錯(cuò)切的單位是有一定要求的坷虑,詳見(jiàn)后文廣義的Arnold變換甲馋。

2.3 代碼實(shí)現(xiàn)

2.3.1 Java泛型的實(shí)現(xiàn)

此處寬高需要相等是方便后續(xù)的逆變換。

public class Arnold<T> {

    /**
     * 貓臉變換
     * @param origin 原始圖像
     * @param dest 用于保存變換后的圖像
     * @param count 變換的次數(shù)
     */
    public void arnold(T[][] origin, T[][] dest, int count) {
        int newY, newX;
        while (count > 0) {
            for (int row = 0; row < origin.length; row++) {
                for (int col = 0; col < origin[0].length; col++) {
                    newX = (col + row) % origin.length;
                    newY = (col + 2 * row) % origin.length;
                    dest[newY][newX] = origin[row][col];
                }
            }
            count--;
            origin = Arrays.copyOf(dest, dest.length);
        }
    }

}

2.3.2 適用于Android的一維數(shù)組形式

/**
 * 貓臉變換
 * @param origin 原始圖像迄损,寬高必須一致
 * @param dest 用于保存輸出
 * @param SIZE 寬和高
 * @param count 變換的次數(shù)
 */
public void arnold(int[] origin, int[] dest, int SIZE, int count) {
    int oldY, oldX, newY, newX;
    while (count > 0) {
        for (int index = 0; index < origin.length; index++) {
            oldX = index % SIZE;
            oldY = index / SIZE;
            newX = (oldX + oldY) % SIZE;
            newY = (oldX + 2 * oldY) % SIZE;
            dest[newY * SIZE + newX] = origin[index];
        }
        count--;
        origin = Arrays.copyOf(dest, dest.length);
    }
}

2.3.3 實(shí)際運(yùn)行結(jié)果

如圖所示,一次變換后账磺,原圖得到了一定程度的置亂芹敌,但還能分辨出原始圖像的信息,6次變換后圖像已看不出原始圖像的信息垮抗。


狹義貓臉變換運(yùn)行結(jié)果

3. 狹義貓臉變換的逆變換

當(dāng)一張圖片的寬度和高度相同時(shí)氏捞,Arnold變換具有逆變換。雖然Arnold變換具有周期性冒版,可以通過(guò)一直變換下去得到原圖液茎,但是周期越長(zhǎng),恢復(fù)原圖也越長(zhǎng)辞嗡。通過(guò)逆變換可以較為方便地把變換后的圖像恢復(fù)捆等。

3.1 逆變換公式

狹義貓臉逆變換矩陣公式

轉(zhuǎn)換為多項(xiàng)式為:

狹義貓臉逆變換多項(xiàng)式公式

3.2 代碼實(shí)現(xiàn)

3.2.1 泛型形式的實(shí)現(xiàn)

/**
 * 貓臉逆變換
 * @param origin 原始圖像
 * @param dest 用于保存變換后的圖像
 * @param count 變換的次數(shù)
 */
public void inverseArnold(T[][] origin, T[][] dest, int count) {
    int newY, newX;
    while (count > 0) {
        for (int row = 0; row < origin.length; row++) {
            for (int col = 0; col < origin[0].length; col++) {
                newX = (col + row) % origin.length;
                newY = (col + 2 * row) % origin.length;
                dest[newY][newX] = origin[row][col];
            }
        }
        count--;
        origin = Arrays.copyOf(dest, dest.length);
    }
}

3.2.2 適用于Android的一維數(shù)組形式

/**
 * 貓臉逆變換
 * @param origin 原圖
 * @param dest 保存變換后的圖像
 * @param SIZE 寬高
 * @param count 變換次數(shù)
 */
public void inverseArnold(int[] origin, int[] dest, int SIZE, int count) {
    int oldY, oldX, newY, newX;
    while (count > 0) {
        for (int index = 0; index < origin.length; index++) {
            oldX = index % SIZE;
            oldY = index / SIZE;
            newY = mod((oldY - oldX), SIZE);
            newX = mod((2 * oldX - oldY), SIZE);
            dest[newY * SIZE + newX] = origin[index];
        }
        count--;
        origin = Arrays.copyOf(dest, dest.length);
    }
}

逆變換的效果當(dāng)然就是把圖像復(fù)原了。此處就不在貼效果圖了续室。

4. 廣義的貓臉變換

4.1 公式

如前文所述栋烤,只要錯(cuò)切的單位滿足取模回填后挺狰,原圖與變換后的圖能夠一一對(duì)應(yīng)明郭,那么該變換就是有效的。滿足這個(gè)條件的公式是:

廣義貓臉變換矩陣公式.png
廣義貓臉變換行列式公式

其逆變換公式為:

廣義貓臉逆變換矩陣公式.png
廣義貓臉逆變換多項(xiàng)式公式.png

4.2 代碼實(shí)現(xiàn)

這里只列出了用于Android的一維數(shù)組形式:

4.2.1 廣義正變換

/**
 * 廣義貓臉變換
 * @param origin 原圖
 * @param dest 變換后的圖
 * @param SIZE 圖像寬度和高度
 * @param count 變換次數(shù)
 */
public void arnold(int[] origin, int[] dest, int SIZE, int count, int a, int b) {
    final int ab_plus_1 = a * b + 1;
    int oldY, oldX, newY, newX;
    while (count > 0) {
        for (int index = 0; index < origin.length; index++) {
            oldX = index % SIZE;
            oldY = index / SIZE;
            newX = (oldX + a * oldY) % SIZE;
            newY = (b * oldX + ab_plus_1 *oldY) % SIZE;
            dest[newY * SIZE + newX] = origin[index];
        }
        count--;
        origin = Arrays.copyOf(dest, dest.length);
    }
}

4.2.2 廣義逆變換

/**
 * 廣義貓臉逆變換
 * @param origin 原圖
 * @param dest 變換后的圖
 * @param SIZE 圖像寬度和高度
 * @param count 變換次數(shù)
 */
public void inverseArnold(int[] origin, int[] dest, int SIZE, int count, int a, int b) {
    final int ab_plus_1 = a * b + 1;
    int oldY, oldX, newY, newX;
    while (count > 0) {
        for (int index = 0; index < origin.length; index++) {
            oldX = index % SIZE;
            oldY = index / SIZE;
            newX = mod(ab_plus_1 * oldX - a * oldY, SIZE);
            newY = mod(oldY - b * oldX, SIZE);
            dest[newY * SIZE + newX] = origin[index];
        }
        count--;
        origin = Arrays.copyOf(dest, dest.length);
    }
}

5. 利用Arnold變換進(jìn)行加密

對(duì)于廣義Arnold變換丰泊,當(dāng)a薯定、b、count任何一個(gè)值不同時(shí)瞳购,變換后圖像也是不相同的话侄。因此,可以把(a苛败、b满葛、count)作為加密參數(shù)對(duì)圖像進(jìn)行加密径簿。此外,還可以對(duì)圖像的不同部分進(jìn)行不同的加密嘀韧,使得更難破解篇亭。例如,可以把圖像分為四份(甚至可以有交集)锄贷,分別對(duì)每一份子圖進(jìn)行加密译蒂,這樣又增大了破解的難度。
Arnold加密后谊却,如果圖像被破壞了柔昼,例如壓縮、涂改等炎辨。解密后的圖像依然能恢復(fù)一部分?jǐn)?shù)據(jù)捕透。
下圖是以參數(shù)(7,11碴萧,4)加密的圖像乙嘀,以及對(duì)加密后的圖像進(jìn)行涂抹后再解密的結(jié)果。

魯棒性測(cè)試
  • (a) 原圖
  • (b) 加密后的圖像
  • (c) 涂抹
  • (d) 解謎后的圖像

可以看出Arnold變換有較高的魯棒性破喻,即使添加了多個(gè)較大的圓也能恢復(fù)出原圖的大致信息虎谢。
根據(jù)Arnold變換的原理,我們還可以用來(lái)加密其它數(shù)據(jù)曹质,而不僅僅是圖像婴噩。

轉(zhuǎn)載須注明出處:http://www.reibang.com/p/39727dbaffd9

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市羽德,隨后出現(xiàn)的幾起案子几莽,更是在濱河造成了極大的恐慌,老刑警劉巖玩般,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件银觅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡坏为,警方通過(guò)查閱死者的電腦和手機(jī)究驴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)匀伏,“玉大人洒忧,你說(shuō)我怎么就攤上這事」坏撸” “怎么了熙侍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蛉抓,道長(zhǎng)庆尘,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任巷送,我火速辦了婚禮驶忌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笑跛。我一直安慰自己付魔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布飞蹂。 她就那樣靜靜地躺著几苍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陈哑。 梳的紋絲不亂的頭發(fā)上妻坝,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音芥颈,去河邊找鬼惠勒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛爬坑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涂臣,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼盾计,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了赁遗?” 一聲冷哼從身側(cè)響起署辉,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岩四,沒(méi)想到半個(gè)月后哭尝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剖煌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年材鹦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耕姊。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桶唐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茉兰,到底是詐尸還是另有隱情尤泽,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站坯约,受9級(jí)特大地震影響熊咽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闹丐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一横殴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妇智,春花似錦滥玷、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至航徙,卻和暖如春如贷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背到踏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工杠袱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窝稿。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓楣富,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親伴榔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纹蝴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1. 概述 利用Arnold變換(又稱貓臉變換)可以對(duì)圖像進(jìn)行置亂,使得原本有意義的圖像變成一張無(wú)意義的圖像踪少。該變...
    Autonavi閱讀 2,047評(píng)論 0 1
  • http://blog.csdn.net/x454045816/article/details/52153250 ...
    G風(fēng)閱讀 7,023評(píng)論 0 1
  • 這些年計(jì)算機(jī)視覺(jué)識(shí)別和搜索這個(gè)領(lǐng)域非常熱鬧塘安,后期出現(xiàn)了很多的創(chuàng)業(yè)公司,大公司也在這方面也花了很多力氣在做援奢。做視覺(jué)搜...
    方弟閱讀 6,444評(píng)論 6 24
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,506評(píng)論 25 707
  • 凌晨兼犯,還不想睡,拿著手機(jī)開(kāi)收音機(jī)——《千里共良宵》集漾。聽(tīng)著聽(tīng)著切黔,豬說(shuō),原來(lái)你也聽(tīng)電臺(tái)呀帆竹,我還以為只有我和師兄聽(tīng)電臺(tái)呢...
    簡(jiǎn)福_Jane閱讀 257評(píng)論 0 0