(山東科技大學(xué) 計算機(jī)科學(xué)與工程學(xué)院,山東 青島 266590)
隨著安全意識和知識產(chǎn)權(quán)意識的提高,人們對自身信息的安全度也越來越重視,數(shù)字水印技術(shù)的使用也越來越多。圖像數(shù)字水印技術(shù)根據(jù)嵌入的水印圖像能否無損恢復(fù)分為可逆和不可逆水印技術(shù)。為了保護(hù)圖像的完整性,可逆水印已成為水印技術(shù)的主流??赡嫠∮址Q無損水印,屬于脆弱性數(shù)字水印,能明顯反映出信號是否被篡改,并且可以在提取出水印之后無損地恢復(fù)原始圖像,適合圖像完整性的認(rèn)證。 因此,可逆圖像水印技術(shù)被廣泛用于醫(yī)學(xué)、軍事和法學(xué)方面等特殊領(lǐng)域的圖片保留存儲工作,用來保證重要圖像信息不丟失。
現(xiàn)有可逆水印算法主要包括頻域算法和空域算法,二者各有優(yōu)劣,頻域算法嵌入容量相對空域較少,但是嵌入效果比空域隱秘??沼蛩惴ǔS玫挠胁钪禂U(kuò)展、直方圖平移和預(yù)測值擴(kuò)展等方法。差值擴(kuò)展(difference expansion, DE)的方法由 Tian[1]在2003年提出,主要思路是通過擴(kuò)展相鄰像素的差值,對像素進(jìn)行稍微改動,利用兩個像素之間的冗余性來實現(xiàn)水印嵌入,水印提取之后,圖像并無失真。 Ni等[2]提出了基于直方圖平移(histogram shifting, HS)的水印嵌入方法,算法實現(xiàn)容易,但是用于像素值均衡的圖像時,嵌入的容量主要取決于峰值點,導(dǎo)致算法的效果并不好。為了得到效果更好的直方圖,Lee等[3]使用差值直方圖替代灰度直方圖,實現(xiàn)嵌入容量的增加。預(yù)測值擴(kuò)展由 Thodi等[4]首先提出,通過相鄰像素計算產(chǎn)生預(yù)測值和原值的差值進(jìn)行水印的嵌入。Ni等[2]利用圖像像素的直方圖平移進(jìn)行水印的嵌入;熊祥光[5]對水印嵌入進(jìn)行一遍多比特嵌入和多遍單比特嵌入的比較,最終得出多遍嵌入的效果更好的結(jié)論。王俊祥等[6]根據(jù)直方圖信息準(zhǔn)確估計多層嵌入后水印容量及相應(yīng)的水印圖像質(zhì)量,使直方圖平移算法在多層嵌入方向進(jìn)行容量估計。Kelkar等[7]對直方圖平移的方法做出改進(jìn),增大了水印的嵌入容量,提高了安全性,但只是針對醫(yī)學(xué)圖像進(jìn)行的研究。為了更好地利用直方圖嵌入水印,黃志強(qiáng)等[8]進(jìn)行鄰域預(yù)測值擴(kuò)展,利用八鄰域與中間像素得到預(yù)測值,通過閾值判斷對水印進(jìn)行嵌入。鄭淑麗等[9]使用相鄰兩像素的差分,選取水平相鄰像素,然后對相鄰像素做差值。通常的差值直方圖都是通過平滑區(qū)域進(jìn)行差值計算得到,為了同時使紋理區(qū)域也得到應(yīng)用,Thomas等[10]提出在紋理區(qū)域和平滑區(qū)域都進(jìn)行差值計算來生成差值直方圖的方法。Mathpati等[11]提出了使用基于中止濾波器的動態(tài)預(yù)測誤差直方圖嵌入水印信息,能夠更加靈活的選取嵌入位。針對溢出問題,Lee等[12]提出了誤差預(yù)測補(bǔ)償?shù)姆椒?,通過相鄰像素來生成差值直方圖。
由于可逆水印算法比較復(fù)雜,為了在保持圖像視覺效果的前提下進(jìn)一步簡化算法復(fù)雜程度,精簡水印嵌入和提取步驟,并且在差值直方圖算法中增加水印的嵌入容量,本研究提出了基于分塊預(yù)測的差值直方圖平移的可逆水印算法,既可以增加嵌入容量也能保證鄰域預(yù)測的精確度。實驗結(jié)果表明,本算法的峰值信噪比(peak signal noise ratio,PSNR)值比文獻(xiàn)[9]高,視覺效果好。
本研究提出一種基于分塊預(yù)測的差值直方圖平移的可逆水印算法,對比傳統(tǒng)的選取3×3的分塊,使用周圍8個像素對中心像素進(jìn)行預(yù)測,提高可嵌入的像素點的個數(shù),從而增加一些嵌入容量;相對于直接采用直方圖平移的方式,可以提高水印直方圖的陡峭性,突出峰值點像素的個數(shù),避免像因素值分布均勻而導(dǎo)致直方圖平移嵌入水印容量少的問題;采用差值直方圖解決直方圖平移的上限溢出問題并能提高PSNR值,使含水印圖像的視覺效果提高。算法的基本原理是根據(jù)圖像的平滑度做出分塊預(yù)測,將載體圖像進(jìn)行4×4分塊,然后分塊為4個像素一組,最后在分塊內(nèi)實施預(yù)測差值直方圖平移實現(xiàn)水印嵌入。
設(shè)原圖像為M×N的灰度圖像,本節(jié)從圖像分塊、水印嵌入、水印提取和圖像恢復(fù)及溢出處理等四個方面說明本研究算法的具體過程。
1) 將原圖像劃分成4×4的圖像塊,記為Bk,k=1,2,3…[M/4]×[N/4],如圖1(a)所示;對圖像進(jìn)行4×4分塊后可能導(dǎo)致最后的行(列)剩余一些像素值,當(dāng)剩余3行(列)時采用圖1(b)分塊方式的前3行(列)進(jìn)行處理;剩余兩行(列)時用圖2方式的前兩行(列)進(jìn)行處理;當(dāng)剩余一行(列)時舍棄最后一行(列)像素值。
圖1 分塊方式Fig.1 Blocking mode
(1)
(2)
6) 根據(jù)計算可以得到一幅差值直方圖,之所以選取差值直方圖,是因為差值直方圖在對其進(jìn)行平移的時候,不用像普通的圖像直方圖一樣,考慮直方圖中像素值的溢出問題,嵌入的水印中不用添加附加信息,以減小算法復(fù)雜度。根據(jù)計算,大部分峰值點是0,為了減少算法復(fù)雜度,直接選取0值點作為嵌入點,使用直方圖平移,把像素值大于0的點向大于0的方向平移一個單位,選取Lena圖像顯示直方圖平移,為了效果明顯,將像素值大于150的像素點右移5位,如圖2、3所示。
7) 根據(jù)差值直方圖判斷嵌入容量,選取大小適合的水印圖片,進(jìn)入水印嵌入過程。
設(shè)圖像大小為M×N,其灰度值為I(i,j) (0≤I(i,j)≤255),把水印圖像轉(zhuǎn)換為水印序列W,選取64×64的二值水印圖片,將圖像轉(zhuǎn)化為1×4 096的水印序列,嵌入水印后的圖像像素值用IW(i,j)表示,詳細(xì)步驟如圖4所示。
圖2 Lena圖像的直方圖平移圖Fig.2 Histogram shifting of Lena
圖3 Lena圖像右移5位直方圖平移圖Fig.3 The right by a five-bit histogram shifting of Lena
圖4 水印嵌入流程圖 Fig.4 Watermark embedding flow chart
水印嵌入具體過程如下:
1) 對原圖像按照圖1(a)、1(b)的方式進(jìn)行分塊處理,分塊后就可以知道原圖像的嵌入點;
2) 然后根據(jù)公式(1)、公式(2)對分塊后的像素塊進(jìn)行計算求出差值,生成差值直方圖;
3) 對于差值直方圖中像素值大于0的部分整體向右平移一個單位,這樣在差值直方圖像素值為1的位置上就會留出空白;
4) 從第一個分塊開始嵌入水印,判斷嵌入點的差值是否為零,差值為零的嵌入水印,不為零的繼續(xù)對分塊內(nèi)的第二個嵌入點進(jìn)行判斷,對4×4分塊內(nèi)的4個點依次判斷,完成后,繼續(xù)對下一個分塊進(jìn)行上述過程,直至所有分塊處理完畢。公式如下所示:
(3)
5) 對水印圖像進(jìn)行處理,把二值水印圖像做成水印序列用于嵌入,根據(jù)水印圖像的大小設(shè)置一個水印嵌入的終止值,此終止值就是水印圖片的大小,例如64×64的水印圖片,終止值就是4 096,當(dāng)可嵌入水印的像素點即差值為0的點達(dá)到4 096時,停止嵌入。
水印從圖像中被提取后,再經(jīng)過下面步驟就能恢復(fù)出原圖像。
1) 對嵌入水印后的圖像進(jìn)行分塊,分塊方式仍是按照圖1(a)、1(b)的方式進(jìn)行;
3) 利用差值生成一個差值直方圖,因為是在差值為0的時候水印嵌入,故差值為1說明嵌入的水印值為1;然后同嵌入水印的順序一樣,從第一個分塊開始進(jìn)行水印提取,對每個嵌入點進(jìn)行判斷,若差值為1,說明嵌入的水印值為1,提取1;若差值為0,說明嵌入的水印值為0,提取0。然后繼續(xù)對分塊內(nèi)的第二個嵌入點進(jìn)行判斷,對4×4分塊內(nèi)的4個點依次判斷完成后,繼續(xù)對下一個分塊進(jìn)行上述過程,直至所有分塊處理完畢。水印提取流程如圖5所示。
圖5 水印提取流程圖 Fig.5 Watermark extraction flow chart
4) 因為水印嵌入時對差值直方圖大于0的像素向右平移了一個單位,使得在嵌入水印前,像素值為1 的像素點數(shù)為0,所以提取水印時對得到的差值進(jìn)行判斷,如果得到的差值點為0,說明嵌入的水印值為0,差值為1說明嵌入的水印值為1。公式如下所示:
(4)
5) 提取水印后,對圖像進(jìn)行恢復(fù),把差值直方圖中差值大于1的像素點向左平移一位,得到原圖像。
普通的直方圖右移要考慮像素值為255的像素值怎么處理,但是差值直方圖不需考慮移位時的溢出。利用差值直方圖在原本像素上嵌入水印時,若像素值是255,則該像素不嵌入水印,因為嵌入的水印值為1的話就會產(chǎn)生溢出;下限0不存在溢出現(xiàn)象,故可嵌入的像素值范圍為[0,255],水印嵌入的判斷公式為:
(5)
同理在提取水印時,對像素值是255的像素不處理,得到水印提取的判斷公式:
(6)
圖6 水印圖像Fig.6 Watermark image
為了驗證本方案的性能,選取了 Lena、Boat、Peppers、Lake、Couple和Plane 6幅較為典型的大小為512×512的8-bit灰度圖像進(jìn)行實驗。水印信息選用64×64的水印。圖 6 給出了一幅大小為64×64的二值圖像作為水印,相當(dāng)于大小 4 096 bits 的二進(jìn)制序列。
選取的6幅原圖像見圖7。
圖7 6幅原圖像Fig.7 Six original images
對上述6幅圖像進(jìn)行分塊處理后,利用公式(1)、(2)得到每一副圖像的差值直方圖,如圖8所示。
圖8 6幅圖像分塊后的差值直方圖Fig.8 Difference histogram of six images after block
根據(jù)得到的差值直方圖,使用直方圖平移,把像素值大于0的點向大于0的方向平移一個單位,然后在0值點嵌入水印,得到嵌入水印后的差值直方圖如圖9所示。
圖9 嵌入水印后的6幅圖像差值直方圖Fig.9 Six image difference histograms after embedding watermark
根據(jù)公式(8)對圖像進(jìn)行水印的嵌入,嵌入后的6幅圖像如圖10所示:
圖10 6幅嵌入水印后的圖像Fig.10 Six watermarked images
對嵌入水印圖像進(jìn)行水印提取和圖像恢復(fù)后的圖像如圖11所示。
圖11 水印提取后的6幅圖像Fig.11 Six images after watermark extraction
從PSNR和最大嵌入容量兩方面來評估算法的性能。PSNR 值越高說明圖像的穩(wěn)健性越好,失真越少,越能夠反映圖像的可視效果,計算公式為:
(7)
其中均方誤差
(8)
表1顯示了Lena、Boat、Lake、Peppers、Couple和Plane 6幅圖像在嵌入大小為64×64的水印圖像時的PSNR結(jié)果圖和最大嵌入容量。
表1 6幅圖像的嵌入容量及嵌入圖7水印的PSNR對比結(jié)果Tab.1 embedding capacity and PSNR of six images’ comparison results of watermark embedded in Fig.7
通常PSNR值的普遍基準(zhǔn)在30 dB,30 dB以下的圖像劣化較為明顯,在50 dB以上則表明效果良好,而表1中本文算法的PSNR的值均達(dá)56 dB以上,說明可視效果很好。一般的空域算法的嵌入量主要與圖像的平滑度有關(guān),圖像越平滑嵌入的容量越大,故整體趨于平滑的圖像,可以嵌入更多的水印。
圖12 本文算法中6幅圖像的PSNR值對比Fig.12 Comparison of PSNR values of six images in the algorithm
圖13 Lena在不同算法下嵌入率和PSNR對比Fig.13 Comparison of Lena images in different algorithms
作用于6幅圖像的PSNR值如圖12,由圖可見6幅圖像隨著嵌入水印大小的增加,圖像的PSNR值逐漸減少,但是減少的幅度不大。從表1和圖12可以看出,在嵌入圖7水印后,使用本算法嵌入水印后的圖像PSNR總體大于56 dB,達(dá)到很好的視覺效果,保證了水印的不可見性和圖像的效果。
使用Lena圖像將本方法與Ni[2]和Zheng[9]的算法進(jìn)行對比(如圖13),可見在嵌入率偏低的情況下,本算法的PSNR值在56 dB以上,而其他兩個算法的PSNR值都在55 dB以下,提出的可逆水印算法的圖像可視效果高于其他兩種算法。
基于直方圖平移和差分直方圖,提出了一種基于分塊預(yù)測的差值直方圖平移的可逆水印算法,對于灰度圖像而言,實現(xiàn)比較簡單,比以八鄰域作為預(yù)測的標(biāo)準(zhǔn)嵌入水印算法的容量高,但總體上水印的嵌入容量比較少,水印的嵌入和提取簡單易懂,且PSNR值都在56 dB以上。通過對最大像素值255的不嵌入來解決像素的溢出問題;本算法在嵌入水印信息時,選擇差值直方圖0值點進(jìn)行嵌入,減少了一定的嵌入量。本方法屬于完全脆弱水印,不具有抗攻擊性。水印的抗攻擊性和嵌入容量的提升是下一步研究的主要方向。