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