陳藝, 樊夢婷, 熊祥光
(貴州師范大學大數據與計算機科學學院, 貴陽 550025)
隨著互聯網技術的飛速發展,數據安全越來越受到人們的高度重視,尤其是在一些諸如醫學、軍事通信、遙感等特殊的應用領域,不僅需要數據的安全性和保密性,更需要數據的完整性。傳統的數據隱藏技術無法滿足新的需求。因此,人們提出了可逆數據隱藏(reversible data hiding,RDH)技術。該技術可將秘密數據嵌入到載體信號中,并且能夠完整地提取嵌入的秘密數據和確保載體信號無損地恢復,這在特殊的應用領域非常實用,目前受到學術界和工業界的廣泛關注。
近年來,研究者們提出了多種RDH方法,在確保能提取嵌入的秘密數據和恢復原始信號的前提下,不斷地提高嵌入性能和抗解密能力。Fridrich等[1]提出了基于圖像無損壓縮的RDH算法,該算法的主要原理是對原始圖像進行無損壓縮以得到冗余空間,然后將秘密數據嵌入到冗余空間中。雖然該算法的秘密數據嵌入過程非常簡單,但是嵌入容量有限,限制了該算法的實際應用。后來,RDH技術得到了廣泛研究。一般來說,根據秘密數據嵌入策略的不同,RDH技術大致可分為三類:基于差值擴展(differential expansion,DE)的可逆數據隱藏算法[2-5]、基于直方圖平移(histogram shifting,HS)的可逆數據隱藏算法[6-10]和基于插值技術(interpolation technology,IT)的可逆數據隱藏算法[12-16]。
Tian[2]最先提出基于DE的RDH算法,通過像素對之間的差值進行擴展以嵌入秘密數據。與基于壓縮技術的RDH算法相比,雖然有效地提高了嵌入性能,但是嵌入秘密數據后的圖像可能會出現像素值溢出,需對這部分像素值進行溢出處理,影響純嵌入容量的大小。Ou等[3]利用兩個相鄰的預測誤差來生成一個由預測誤差對組成的序列進行秘密數據嵌入,提高了算法的整體性能。Dragoi等[4]研究了局部預測在差值擴展可逆數據隱藏中的應用,提出了一種新的基于四元差值擴展的多層嵌入方法,Arham等[5]提出一種改進的算法來減少像素中的差值,從而提高數據隱藏的容量和視覺質量。隨后Ni等[6]提出基于HS的RDH算法,該算法利用載體圖像像素直方圖的特點進行秘密數據嵌入。雖然該算法具有很好的視覺質量,但是總體來看該算法的性能不是很好,嵌入容量不高。后來,基于HS思想,一系列改進算法[7-11]相繼被提出。例如,Luo等[7]采用插值預測技術將秘密數據嵌入預測誤差直方圖中;Thodi等[11]結合DE和HS兩種方法的優點,提出新的預測誤差擴展方案,將秘密數據嵌入到預測誤差直方圖中,提高了算法的整體性能。
Jung等[12]最先提出基于IT的RDH算法,該算法先基于原始圖像應用鄰域均值插值(neighbor mean interpolation,NMI)方法生成插值圖像;然后僅在插值像素中嵌入秘密數據,具有非常高的嵌入容量和視覺質量。后來,Lee等[13]在Jung等[12]的工作基礎上,提出基于鄰域像素插值(interpolation by neighboring pixels,INP)方法的可逆數據隱藏算法。該算法根據相鄰像素進行加權插值,然后在插值像素中嵌入秘密數據。與文獻[14]相比,嵌入容量有所提升。然而,該算法的整體性能還有進一步提升的空間。文獻[14-16]對插值方法和嵌入方法進行改進,與文獻[12-13]中的算法相比,性能有所提升。文獻[17]采用中心折疊策略(center folding strategy,CFS)對待嵌入的秘密數據進行重編碼,然后再嵌入編碼后的數據。該算法通過將秘密數據進行折疊,有效地減少了嵌入秘密數據后造成的失真,在相同的嵌入容量條件下,具有更好的視覺質量。Lu等[18]將CFS和INP兩種技術相結合,提出基于插值自適應的可逆數據隱藏算法。該算法先將輸入圖像縮小以生成原始圖像,并將其分成若干不重疊的3×3像素塊;然后利用INP插值方法對像素塊進行插值。在嵌入秘密數據之前,對待嵌入的秘密數據采用中心折疊策略先進行編碼,然后再嵌入。此外,利用分塊中4個參考像素的方差來判斷待嵌入秘密數據的長度,有效地提高了圖像質量和隱藏能力。然而,在對秘密數據進行編碼的過程中,待嵌入的秘密數據被編碼成正負兩部分,各部分的最大值仍然較大,直接嵌入仍會造成失真較大。Lu等[21]提出一種新的多層折疊方案,將秘密數據折疊編碼成碼對,再將其嵌入到插值圖像的插值像素中。該編碼對比原始秘密數據的編碼對小,有效地降低了圖像的失真。然而,該算法的性能仍然有進一步提升的空間。通過分析發現在該方案中,雖然通過多層折疊將秘密數據編碼成碼對,編碼后的數據已較小,但是該方案并未充分利用多層折疊編碼的性能,存在兩個不會造成額外失真的碼對。為進一步提高嵌入容量和嵌入數據后的圖像質量,基于插值和改進的多層編碼技術提出了一種改進的可逆數據隱藏算法。首先,提出一種改進的圖像插值算法生成插值圖像;其次,對待嵌入的秘密數據進行重編碼。編碼時考慮在每個不會造成額外失真的碼對中額外嵌入一個秘密數據位以提高嵌入容量。同時,使用失真更小的中心折疊方案以進一步減小嵌入秘密數據后的失真。現以基于圖像插值的多層折疊編碼為研究內容,以高率失真性能為目標,以期為基于圖像插值的可逆信息隱藏技術提供理論基礎。
Jung等[12]提出的算法先對w×h(w和h分別為圖像的寬和高)的輸入圖像I進行下采樣,生成大小為(w/2)×(h/2)的原始圖像O;然后,利用插值算法將插值像素插入相鄰的原始像素之間,生成與輸入圖像同大小的插值圖像C,相應的插值方法為
C(i,j)=

(1)
式(1)中:1≤i≤w/2;1≤j≤h/2。對于插值圖像C中的邊界像素,用前一行和前一列對應位置上的像素進行填充即可。




(2)

(3)

(4)


(5)
式(5)中:Nind為4比特索引碼對應的十進制數。
然后,將編碼后的數據Nind嵌入中心插值像素中,即
p′c=pc+Nind
(6)
式(6)中:pc為3×3分塊的中心像素值;p′c為嵌入4比特索引碼后的像素值。

圖1 文獻[21]的數據嵌入流程圖Fig.1 Data embedding flowchart of reference [21]
對Lu等[21]的方案進行深入分析后發現:
(1)雖然使用閾值控制策略可有效地減小失真,但是不同類型的圖像的嵌入容量波動較大,平滑圖像的嵌入容量往往較高,而紋理豐富的圖像的嵌入容量往往較低。
(2)雖然通過中心折疊編碼有效降低了嵌入秘密數據后的失真,但是該方案并未充分利用編碼的性能對秘密數據進行折疊編碼。例如,在該方案中,有兩個碼對(0, 2)和(1, 2)并未使用。事實上,當嵌入3位秘密數據時,索引碼indq可以設置成0

表1 嵌入3位秘密數據時的編碼方案

表2 提出的編碼方案和文獻[21]的編碼方案對比
一般情況下,嵌入秘密數據后,插值像素可能會出現溢出。對于提出的算法,在插值階段先對插值像素進行溢出處理,然后再嵌入秘密數據,使嵌入秘密數據后不會出現溢出。
提出的圖像插值方法如圖2所示。在圖2中,Oim為第i個分塊中的第m(m=1,2,3,4)個像素值。

圖2 提出的圖像插值方法Fig.2 The proposed image interpolation method
具體的插值步驟如下。
(1)將輸入圖像O劃分為若干2×2像素塊,然后使用式(7)將第i個2×2像素塊插值生成3×3的像素塊。

(7)
(2)生成插值圖像后,在嵌入秘密數據過程中可能會出現像素值溢出現象。在嵌入秘密數據過程中,假設在每個插值像素中嵌入3位的秘密數據,則插值像素Ci1、Ci2、Ci3和Ci4的像素值變化范圍為[-2, 2]。當這些插值像素的像素值范圍為[2, 253]時,嵌入秘密數據后就不會出現溢出。中心插值像素Ci0的變化范圍為[-7, 8],當像素值范圍為[7, 247]時,嵌入秘密數據后就不會出現溢出。因此,為了解決嵌入秘密數據后的溢出問題,利用式(8)和式(9)對生成的插值像素進行溢出處理。

(8)

(9)
在嵌入秘密數據之前,先對秘密數據進行編碼,秘密數據嵌入流程圖如圖3所示,詳細的嵌入步驟如下。


(10)

(11)
C′q=Cq+d′q
(12)
(3)將四位索引碼indq按順序排列,通過式(13)將其轉換成十進制整數sum_ind。

(13)
(4)為使嵌入秘密數據后中心插值像素Ci0的失真較小,采用偏移折疊(偏移值k_a的選取如表3所示)的方式對索引碼進行折疊編碼,即
sum_ind′=sum_ind-k_a
(14)
(5)將折疊后的數據sum_ind′嵌入中心像素Ci0中。當所有分塊都嵌入秘密數據后,嵌入過程完成。
C′i0=Ci0+sum_ind′
(15)
嵌入的秘密數據的提取方法是嵌入方法的逆過程,限于篇幅,這里不再贅述。

圖3 提出算法的流程圖Fig.3 The flowchart of the proposed algorithm

圖4 提出算法的數據嵌入和提取示例Fig.4 An example of data embedding and extraction of the proposed algorithm
當嵌入秘密數據時,原始像素塊O通過式(7)生成插值像素塊C。對于第一個插值像素C(1,2)=51,將3位二進制秘密數據轉換成十進制,即S1=(001)2=(1)10。然后,使用式(10)和式(11)將其編碼成索引碼ind1=0和折疊碼d1=S1=2b-2=-1。最后,將折疊碼嵌入到插值像素C(1,2)中,即W(1,2)=C(1,2)+d1=50。類似地,可在余下的3個插值像素C(2,1)、C(2,3)和C(3,2)中分別嵌入3位秘密數據。在這4個插值像素中嵌入秘密數據后,得到4位索引碼組成的二進制位串,然后將其轉換為十進制數,即sum_ind=8ind1+4ind2+2ind3+ind4=5。通過折疊后sum_ind′=sum_ind-7=-2,再將其嵌入到中心插值像素中,即W(2,2)=C(2,2)+sum_ind′=48。
提取秘密數據時,采用相同的插值方法得到相同的插值像素塊C。對于嵌入秘密數據后的插值像素W(2,2),嵌入的數據為sum_ind′=W(2,2)-C(2,2)=48-60=-2,通過逆編碼,可以得到編碼前的4位秘密數據為 (0101)2。即4個插值像素C(1,2)、C(2,1)、C(2,3)和C(3,2)的索引碼分別為0、1、0和1。插值像素C(1,2)嵌入的秘密數據為:d1=W(1,2)-C(1,2)=-1,根據得到的索引碼ind1=0,可計算出秘密數據S1=2b-2+d1=(1)10=(001)2,和嵌入的3位秘密數據相同。類似地,可在C(2,1)、C(2,3)和C(3,2)三個插值像素中提取嵌入的秘密數據。
為測試提出算法的性能,從BossBase和BOWS-2圖像數據庫中各隨機選取100張圖像作為輸入圖像,待嵌入的秘密數據為偽隨機產生的二值信號。采用峰值信噪比(peak signal to noise ratio,PSNR)和比特率(bit per pixel,BPP)來分別衡量嵌入秘密數據后圖像失真與嵌入容量的性能。PSNR和BPP的計算公式為

(16)

(17)
式中:xi和x′i分別為輸入圖像和嵌入秘密數據后圖像的第i個像素值;w、h和M分別為輸入圖像的長度、寬度和已嵌入在插值圖像中的秘密數據長度。
在秘密數據嵌入過程中,因為編碼時采用移位的編碼策略,導致生成的索引碼0和1不再是等概率分布,所以在每個分塊的中心像素嵌入秘密數據時,中心折疊策略不再適合提出的算法。為了選取合適的k_a值,在隨機選取的100張圖像上進行實驗,相應的統計結果如表3所示。從表3可以看出,當k_a=7時,嵌入秘密數據后隱秘圖像的PSNR最好。因此,在下面的實驗中,k_a都設置為7。
圖5為本文算法與文獻[21]算法在最大嵌入容量時的比較。從圖5可以看出,本文算法在每張圖像上嵌入的秘密數據容量是相同的,而文獻[21]算法具有一定的波動。主要原因是本文算法在圖像插值階段使用了溢出處理策略,使在嵌入秘密數據時不會出現溢出,所有的插值像素都能嵌入秘密數據,使得所有圖像的嵌入容量相同。然而,文獻[21]算法使用自適應方案,導致不同載體圖像的嵌入容量有所不同。

表3 中心像素不同折疊方案的對比

圖5 每幅圖像的嵌入容量比較Fig.5 Comparison of embedding capacity of each image
為測試本文算法的性能,以0.1 BPP為初始值和0.1為步長,測試在相同的BPP條件下隱秘圖像的質量。在Goldhill和Airplane這兩張典型圖像上的實驗結果如圖6所示。從圖6可以看出,本文算法的性能均優于同類算法,相較于文獻[21]的算法,本文算法不僅在嵌入容量上有所提高,而且在嵌入相同BPP容量數據的條件下,本文算法也具有更好的PSNR值。

圖6 Airplane和Goldhill兩幅圖像的比較結果Fig.6 Comparison of Airplane and Goldhill images
表4顯示在BPP為1.3時不同算法的性能對比。從表4可以看出,提出算法的PSNR是最高的。與文獻[18-21]中的算法相比,PSNR分別提高了10.26%、10.85%、6.11%和1.62%,平均提高率為7.21%。
此外,為進一步測試提出算法的優越性能,在BossBase和BOWS-2數據庫中各隨機選擇100張圖像進行實驗,相應的實驗結果如圖7所示。從圖7可以看出,在相同的BPP條件下,本文算法具有更高的PSNR值,表明本文算法具有更好的性能。
圖8為插值圖像和嵌入秘密數據后圖像的直方圖比較結果。從圖8可以看出,插值圖像和嵌入秘密數據后圖像的直方圖非常相似。因此,提出算法能夠抵抗直方圖隱寫分析攻擊。圖9為插值圖像和嵌入秘密數據后圖像的RS(regular singular)隱寫分析結果。從圖9可以看出,提出算法也能抵抗RS隱寫分析。

表4 不同算法在不同數據集上插值圖像和隱密 圖像的PSNR對比

圖7 幾種相似算法的比較結果Fig.7 Comparison results of several similar algorithms

圖8 直方圖對比分析結果Fig.8 Comparison of histogram analysis results

圖9 RS隱寫分析結果Fig.9 RS steganalysis results
提出了一種基于插值技術和多層折疊的可逆數據隱藏算法,具有如下的特點。
(1)先對輸入圖像進行互不重疊的2×2分塊,然后對每個分塊利用提出的圖像插值算法生成3×3 的分塊。為使嵌入秘密數據時不出現溢出,在插值階段對插值像素進行了溢出處理。
(2)對待嵌入的秘密數據進行多層折疊編碼,然后再嵌入插值像素中,使插值像素的失真盡可能地降低,提高了隱秘圖像的視覺質量。在 BossBase 和BOWS-2圖像數據庫上的大量實驗結果表明,與同類算法相比,在相同的BPP條件下,提出算法在PSNR方面有顯著的提高。此外,提出算法也能抵抗直方圖和RS隱寫分析,這些結果表明提出算法是有效的。