2013-04-04 42 views
6

在隱寫術中,least significant bit (LSB) substitution方法將隱藏位嵌入來自覆蓋介質的位的位置,例如圖像像素。在一些方法中,獲取圖像的Discrete Wavelet Transform(DWT)並將祕密比特嵌入DWT係數中,之後使用逆變換來重建隱祕圖像。DWT如何用於LSB替代隱寫術

但是,DWT產生浮點係數,對於LSB替換方法,需要整數值。我讀過的大多數論文都使用二維哈爾小波,但他們不清楚他們的方法。我已經看到了變換被定義爲低通濾波器和高通濾波器(浮點變換),或者取對值的總和和差值,或平均值和平均值差值等。

更明確地說,無論是在正向或逆向變換(但不一定取決於所使用的公式),最終會出現浮點數。我無法獲得這些係數,因爲替換不起作用,並且我無法將它們用於重建像素,因爲圖像需要整數值進行存儲。

例如,我們考慮一對像素AB作爲一維數組。低頻係數由總和(即,s = A + B)和高頻係數差(即,d = A - B)定義。然後我們可以用B = (s - d)/2A = s - B重建原始像素。然而,在任何位與係數交織之後,s - d可能不再是可能的了,浮點值將出現在重建的像素上。

對於2D情況,1D變換分別應用於行和列,所以最終除以4會發生在某處。這可能導致浮點數爲.00,.25,.50和.75的值。我只遇到one paper這解決了這個問題。其餘的方法非常模糊,我努力複製它們。然而,DWT已被廣泛用於圖像隱寫。

我的問題是,由於我讀過的一些文獻沒有受到啓發,這怎麼可能?如何使用引入浮點值的轉換,但整個隱寫方法需要整數?

回答

7

已經爲我工作的一個解決方案是使用整數小波變換,其中一些也稱爲lifting scheme。對於Haar小波,我已經看到了它定義爲:

s = floor((A + B)/2) 
d = A - B 

而對於逆:

A = s + floor((d + 1)/2) 
B = s - floor(d/2) 

所有在整個過程中值是整數。它的工作原因是因爲公式包含關於像素/係數的偶數部分和奇數部分的信息,所以不會因舍入而丟失信息。即使修改係數然後進行逆變換,重構的像素仍然是整數。

在Python實現示例:

import numpy as np 

def _iwt(array): 
    output = np.zeros_like(array) 
    nx, ny = array.shape 
    x = nx // 2 
    for j in xrange(ny): 
     output[0:x,j] = (array[0::2,j] + array[1::2,j])//2 
     output[x:nx,j] = array[0::2,j] - array[1::2,j] 
    return output 

def _iiwt(array): 
    output = np.zeros_like(array) 
    nx, ny = array.shape 
    x = nx // 2 
    for j in xrange(ny): 
     output[0::2,j] = array[0:x,j] + (array[x:nx,j] + 1)//2 
     output[1::2,j] = output[0::2,j] - array[x:nx,j] 
    return output 

def iwt2(array): 
    return _iwt(_iwt(array.astype(int)).T).T 

def iiwt2(array): 
    return _iiwt(_iiwt(array.astype(int).T).T) 

有些語言已經內置了用於此目的的功能。例如,Matlab使用lwt2()ilwt2()來進行2D提升方案小波變換。

els = {'p',[-0.125 0.125],0}; 
lshaarInt = liftwave('haar','int2int'); 
lsnewInt = addlift(lshaarInt,els); 
[cAint,cHint,cVint,cDint] = lwt2(x,lsnewInt) % x is your image 
xRecInt = ilwt2(cAint,cHint,cVint,cDint,lsnewInt); 

其中IWT用於隱祕圖像的製品的例子是Raja, K.B. et. al (2008) Robust image adaptive steganography using integer wavelets.