日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

变换域信息隐藏--DCT

發(fā)布時(shí)間:2024/3/26 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 变换域信息隐藏--DCT 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

思想提出背景–空間域隱藏

空間域隱藏是基于位圖分解的思想產(chǎn)生的,其主要方法是將秘密信息存儲(chǔ)到載體不那么重要的部分中,這樣即使改變了載體的部分信息后,載體從肉眼來(lái)看也不會(huì)有太大區(qū)別。這種隱藏方法的優(yōu)點(diǎn)是容量大,肉眼很難識(shí)別;但是缺點(diǎn)是直接隱藏了秘密信息,而且存儲(chǔ)信息區(qū)域過(guò)于連續(xù),容易造成載體統(tǒng)計(jì)特性的改變,而且因?yàn)樾畔⒋鎯?chǔ)在載體的最低有效位,在傳輸過(guò)程中很容易被一些壓縮算法破壞。針對(duì)上述問(wèn)題,研究者嘗試將信息放在相對(duì)重要的的部位中,在不影響載體完整性的前提下盡可能將信息隱藏到低頻系數(shù)中去。

變換域?qū)W習(xí)中的一些小想法

變換域替換是將秘密信息存儲(chǔ)至載體相對(duì)重要的區(qū)域來(lái)規(guī)避壓縮算法和一些破壞行為,變換域替換包括DCT,傅里葉算法和小波變換,本文將主要介紹DCT算法。
其算法比較復(fù)雜,涉及的數(shù)學(xué)知識(shí)也比較多,就也不做詳細(xì)介紹。有一點(diǎn)值得分享一下。傅里葉算法是高數(shù)中的一個(gè)知識(shí)點(diǎn),其思想是將一個(gè)波分解為多個(gè)正余弦波的合,聽(tīng)起來(lái)好像沒(méi)什么意思,但是這種算法我們?cè)谏钪忻繒r(shí)每刻都在使用。比如我們到菜市場(chǎng),有人的喧鬧聲,車(chē)聲,叫賣(mài)聲,我們接收的是雜亂無(wú)序的的音波,我們是如何分辨出他們的呢?
這就是傅里葉變換的應(yīng)用,接收這些聲波后,我們的大腦作快速傅里葉變換,將雜亂無(wú)序的波分解為多個(gè)波之和,大腦直接過(guò)濾掉不需要的波后,我們就能接收到想要的信息了,很神奇的方法不是嗎。
學(xué)計(jì)算機(jī)越久,越懷疑世界的真實(shí)性,萬(wàn)物皆可編程的時(shí)代,我們看似一些神奇和自然的現(xiàn)象都可以用數(shù)學(xué)和計(jì)算知識(shí)來(lái)解釋。程序世界的運(yùn)轉(zhuǎn)依賴(lài)與程序員設(shè)定的各項(xiàng)常量變量,三十萬(wàn)千米每秒,6.2607015×10-34 J·s的普朗克常數(shù),G=6.67259×10-11N·m2/kg2的引力常量,這些又是誰(shuí)設(shè)置的常量呢。我們的一切感知都是大腦告訴我們的,現(xiàn)在的科學(xué)已經(jīng)能通過(guò)電信號(hào)來(lái)模擬大腦的一些活動(dòng),那我們又如何確定自己所處的是真實(shí)的世界呢,或許真實(shí)的世界中我們只是一個(gè)個(gè)培養(yǎng)瓶中的大腦,不斷接受外部信號(hào)刺激來(lái)給我們?cè)斐筛鞣N經(jīng)歷的感受 黑客帝國(guó)既視感:),感覺(jué)科學(xué)的盡頭是神學(xué)還是有一點(diǎn)道理。

DCT變換域隱藏

言歸正傳,目前的主流隱藏方法,且兼顧效率與隱蔽性的算法是基于離散余弦變換的信息隱藏算法(DCT),該算法涉及比較復(fù)雜的數(shù)學(xué)知識(shí),只能簡(jiǎn)要說(shuō)下其原理:離散余弦變換是將圖像由空間域轉(zhuǎn)化到頻率域上,將圖像計(jì)算為二維余弦波,從效果來(lái)說(shuō)是將圖像計(jì)算為一個(gè)DCT系數(shù)矩陣,該矩陣代表圖像的頻率分布,頻率低的為圖像中相對(duì)重要的主體信息,高頻則是圖像的一些細(xì)節(jié),但該矩陣中的像素與圖像像素不存在一一對(duì)應(yīng)關(guān)系。 然后將秘密信息根據(jù)自己的算法隱藏到DCT系數(shù)中即可,隱藏位置多選擇中頻區(qū)域,是在透明性和魯棒性之間做了折中的選擇。
本文設(shè)計(jì)的算法是利用dct系數(shù)的相對(duì)變化存儲(chǔ)10信息(可用該10信息代表黑白,即可嵌入圖片)。
引用一張覺(jué)得很不錯(cuò)關(guān)于域的分解圖

變換域隱藏借助python的實(shí)現(xiàn)很簡(jiǎn)單,只需一句代碼
img_dct=cv2.dct('打開(kāi)的文件‘)
使用需要注意兩點(diǎn),打開(kāi)的文件需要以灰度圖像打開(kāi),而且需要將其轉(zhuǎn)為float類(lèi)型。示例如下:
img=cv2.imread(’文件路徑',cv2.IMREAD_GRAYSCALE)
img1=img.astype('float')

基于變換域的壓縮方法

變換域的思想在壓縮領(lǐng)域應(yīng)用相當(dāng)廣泛,下載的專(zhuān)輯可能一首歌要幾十M,但是同樣的mp3格式就可能只要3-4M,而且大部分人可能很難聽(tīng)出其中區(qū)別,這就是利用了變換域的方法,壓縮掉細(xì)節(jié)和不那么重要的高頻部分。
壓縮代碼示例如下:

def zip(num1,num2):#參數(shù)為保留范圍recor_temp = img_dct[num1:num2, num1:num2]recor_temp2 = np.zeros(img.shape)print(img.shape)recor_temp2[num1:num2, num1:num2] = recor_tempimg_recor1 = cv2.idct(recor_temp2)plt.figure('zip')plt.subplot(121),plt.title('origin')plt.imshow(img)plt.subplot(122),plt.title('zip')plt.imshow(img_recor1)plt.show()

效果對(duì)比如下:

保留像素0-300

保留像素100-400
可以看到保留相同數(shù)量的像素,僅僅是范圍后移了100就有如此大的差別,同時(shí)也驗(yàn)證了圖像主要部分存儲(chǔ)在低頻系數(shù)內(nèi),而300像素點(diǎn)就能基本保存一張1920*1080圖片的主題,也說(shuō)明了基于變換域的壓縮算法效率是相當(dāng)高的。

信息嵌入

DCT信息隱藏的手段主要是將秘密信息以一定方式隱藏到DCT系數(shù)中,方法不限于直接嵌入到float的最后幾位,還有通過(guò)系數(shù)的奇偶存儲(chǔ),比較特定位置上兩個(gè)系數(shù)的大小等,變換域信息隱藏是我最喜歡的信息隱藏方法,沒(méi)有之一,因?yàn)檫@中隱寫(xiě)方法的高明之處在于不把信息直接隱藏到載體中,而是通過(guò)自行約定的一種算法,并且秘密信息在載體中沒(méi)有絲毫體現(xiàn)。這個(gè)特性使得檢測(cè)者即使拿到載體圖片,甚至分析出了其中含有秘密信息也很難破解其中的具體信息。DCT信息隱藏中,信息隱寫(xiě),隱寫(xiě)算法,明文加密,三者同時(shí)保證了秘密信息的安全性。

問(wèn)題

但是在信息嵌入的時(shí)候有幾個(gè)點(diǎn)需要注意:
1.嵌入位置: DCT信息隱藏的思想是將秘密信息存儲(chǔ)到相對(duì)重要的區(qū)域,防止被一些針對(duì)高頻的圖像壓縮算法破壞,所以信息具體的隱藏位置出于不同目的會(huì)有不同選擇。
2.嵌入算法: 由于DCT信息隱藏是將秘密信息存儲(chǔ)到圖像的DCT系數(shù)中,那么系數(shù)的變化規(guī)則應(yīng)當(dāng)本著對(duì)載體修改盡可能小,秘密信息盡可能隱蔽的原則來(lái)實(shí)現(xiàn)。
3.抗分析: 雖然信息隱寫(xiě)學(xué)科發(fā)展時(shí)間較短,但是針對(duì)目前隱寫(xiě)算法也有了很多行之有效的分析方法。其中對(duì)于DCT隱寫(xiě)分析威脅最大的應(yīng)該就是卡方檢測(cè)了,基于統(tǒng)計(jì)分析實(shí)現(xiàn)簡(jiǎn)單,導(dǎo)致其門(mén)檻較低而應(yīng)用廣泛,準(zhǔn)確率又相對(duì)較高。所以如何有效對(duì)抗統(tǒng)計(jì)分析是DCT信息隱寫(xiě)面臨比較嚴(yán)峻的問(wèn)題。

分析及解決

1.信息嵌入位置:
如果修改低頻部分,容易看出變化,隱蔽性較差;如果修改高頻部分,雖然邊緣輪廓替換不容易被識(shí)別,但是容易被處理高頻的壓縮算法破壞,魯棒性比較差。所以最好采用折中方案—修改中頻系數(shù)。而針對(duì)不同的用途,修改系數(shù)位置的細(xì)節(jié)還可以有一定不同,例如數(shù)字水印主要目的是保證嵌入信息的健壯性,所以可以在較中頻系數(shù)略低的位置隱寫(xiě),而信息隱藏更注重保證信息的隱蔽性,修改頻率過(guò)低的可能會(huì)導(dǎo)致視覺(jué)效果變化,所以可以在較中頻系數(shù)較高的位置隱寫(xiě)。
2.信息隱藏算法:
信息如何隱藏到dct系數(shù)中有很多選擇,首次實(shí)驗(yàn)中采取比較兩個(gè)特定位置的dct系數(shù)大小來(lái)隱藏信息,左邊較大表示1,右邊較大表示0,雖然看似只能存儲(chǔ)1和0,但是應(yīng)用可以更加廣泛,比如存儲(chǔ)灰度圖像。提取過(guò)程就只需將載體圖片dct變換后讀取特定位置的dct系數(shù)即可。但是dct系數(shù)可以一直讀取下去,所以按照讀取原則讀的話可以一直讀取到信息,這樣傳輸時(shí)需要提前商定秘密信息長(zhǎng)度,這在實(shí)際傳輸中是比較不科學(xué)的。針對(duì)此問(wèn)題,在后續(xù)實(shí)驗(yàn)中實(shí)現(xiàn)了一種方法—將秘密信息長(zhǎng)度也隱藏在載體中。在第一個(gè)提取位置存儲(chǔ)秘密信息長(zhǎng)度,再根據(jù)長(zhǎng)度提取之后的秘密信息。而在隱寫(xiě)過(guò)程中對(duì)DCT系數(shù)修改時(shí)也發(fā)現(xiàn),修改值的大小雖然在隱藏信息提取時(shí)沒(méi)什么影響,但是對(duì)于載體圖像可能會(huì)造成一定破壞。如果添加的值過(guò)大可能會(huì)造成載體圖像出現(xiàn)白點(diǎn)等現(xiàn)象,所以在對(duì)系數(shù)的更改時(shí)簡(jiǎn)便起見(jiàn)可以統(tǒng)一修改0.01,以保證載體圖像視覺(jué)上的完整性。
3.隱寫(xiě)分析抵抗:
我認(rèn)為DCT信息隱藏方法在抗分析上有先天優(yōu)勢(shì),主流有效的分析方法大部分都是基于統(tǒng)計(jì)分析的,而DCT隱藏雖然修改了系數(shù),但是根據(jù)算法和修改程度的不同可以有效規(guī)避統(tǒng)計(jì)分析檢測(cè)。目前基于卡方統(tǒng)計(jì)的破解隱寫(xiě)方法對(duì)于隱寫(xiě)內(nèi)容多,修改大的隱藏方式效果較好,但若是僅修改了少數(shù)DCT系數(shù),就很難識(shí)別。上面實(shí)現(xiàn)的算法修改也相對(duì)較大,如果左右系數(shù)的值相差較大可能會(huì)造成某個(gè)值修改明顯的情況。對(duì)于這一點(diǎn)可以?xún)?yōu)化算法進(jìn)行解決,實(shí)現(xiàn)中DCT系數(shù)是以float類(lèi)型存儲(chǔ),我們可以判斷系數(shù)最后一個(gè)小數(shù)位的奇偶來(lái)存儲(chǔ)1或0,相對(duì)于前一種算法修改值就大大下降了。
而且隱寫(xiě)分析使用的統(tǒng)計(jì)分析方法在隱寫(xiě)時(shí)同樣可以使用,我們可以在保證不被分析出的情況下存儲(chǔ)秘密信息。上面實(shí)現(xiàn)的算法算是比較浪費(fèi)的一種,如果要存儲(chǔ)n個(gè)字符需要2n個(gè)像素點(diǎn),但是存儲(chǔ)五個(gè)字符也只占用了十個(gè)像素點(diǎn),這在一張1920*1080的圖片中想探測(cè)出來(lái),我認(rèn)為是相當(dāng)困難的??ǚ綑z測(cè)最終要算出可能存在隱寫(xiě)的概率P,如果P等于1或者0就很容易確定是否有信息隱寫(xiě),但是當(dāng)p等于0.5時(shí)是否還容易判斷呢,我把這種情況的系數(shù)叫做混淆系數(shù),我們?cè)陔[寫(xiě)過(guò)程中如果要嵌入大量信息,如果能將卡方計(jì)算出的P控制在混淆系數(shù)左右或者以下,對(duì)于檢測(cè)者來(lái)說(shuō)辨別的難度更是增加了不少。

代碼–包含壓縮和嵌入

import cv2 import numpy as np import matplotlib.pyplot as plt def zip(num1,num2):recor_temp = img_dct[num1:num2, num1:num2]recor_temp2 = np.zeros(img.shape)print(img.shape)recor_temp2[num1:num2, num1:num2] = recor_tempimg_recor1 = cv2.idct(recor_temp2)plt.figure('zip')plt.subplot(121),plt.title('origin')plt.imshow(img)plt.subplot(122),plt.title('zip')plt.imshow(img_recor1)plt.show() img=cv2.imread('D:\earth.jpg',cv2.IMREAD_GRAYSCALE) img1=img.astype('float') img_dct=cv2.dct(img1) mes="10010" for i in range(0,len(mes)):#嵌入if mes[i]=='1':if img_dct[i][1917-i]>img_dct[i][1918-i]:passelse:img_dct[i][1917-i]=img_dct[i][1918-i]+0.1elif mes[i]=='0':if img_dct[i][1917-i]<img_dct[i][1918-i]:passelse:img_dct[i][1918-i]=img_dct[i][1917-i]+0.1 img_recover=cv2.idct(img_dct) img_decode=cv2.dct(img_recover) getmsg="" for i in range(0,len(mes)):#提取if img_dct[i][1917 - i] > img_dct[i][1918 - i]:getmsg=getmsg+"1"else:getmsg=getmsg+"0" print("Deliverd message is: ",mes) print("Ranger message is: ",getmsg) plt.imshow(img_recover) plt.savefig('D:/earth_insert.jpg') plt.figure('DCT') plt.subplot(121),plt.title('origin') plt.imshow(img) plt.subplot(312),plt.title('DCT') plt.imshow(img_dct) plt.subplot(122) plt.imshow(img_recover),plt.title('recover') plt.show()

總結(jié)

以上是生活随笔為你收集整理的变换域信息隐藏--DCT的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。