2013-04-04 15 views
6

Bei der Steganographie bettet die least significant bit (LSB) substitution-Methode die geheimen Bits anstelle von Bits aus dem Cover-Medium ein, z. B. Bildpixel. In einigen Verfahren wird die Discrete Wavelet Transform (DWT) des Bildes genommen und die geheimen Bits werden in die DWT-Koeffizienten eingebettet, wonach die inverse Transformationsform verwendet wird, um das Stego-Bild zu rekonstruieren.Wie kann DWT in LSB-Substitutions-Steganographie verwendet werden

Die DWT erzeugt jedoch Float-Koeffizienten und für die LSB-Substitutionsmethode sind Integer-Werte erforderlich. Die meisten Arbeiten, die ich gelesen habe, benutzen das 2D Haar Wavelet, aber ihre Methoden sind nicht klar. Ich habe gesehen, dass die Transformation in Form von Tief- und Hochpassfiltern (Float-Transformationen) definiert ist oder die Summe und die Differenz von Paarwerten oder die durchschnittliche und mittlere Differenz usw.

genauer gesagt entweder in der vorwärts oder die inverse Transformation (aber nicht unbedingt in beiden abhängig von den verwendeten Formeln) schließlich werden Gleitkommazahlen erscheinen. Ich kann sie nicht für die Koeffizienten haben, weil die Substitution nicht funktioniert und ich kann sie nicht für die rekonstruierten Pixel haben, weil das Bild ganzzahlige Werte für die Speicherung benötigt.

Betrachten wir zum Beispiel ein Paar Pixel, A und B als 1D-Array. Der Niederfrequenzkoeffizient ist definiert durch die Summe, d. H. s = A + B, und den Hochfrequenzkoeffizienten durch die Differenz, d. H. d = A - B. Wir können dann die ursprünglichen Pixel mit B = (s - d)/2 und A = s - B rekonstruieren. Nach jedem Bitwechsel mit den Koeffizienten ist s - d möglicherweise nicht mehr gerade und Float-Werte werden für die rekonstruierten Pixel auftauchen.

Für den 2D-Fall wird die 1D-Transformation getrennt für die Zeilen und die Spalten angewendet, sodass irgendwann irgendwo eine Division durch 4 erfolgt. Dies kann zu Werten mit den float-Resten .00, .25, .50 und .75 führen. Ich bin nur auf one paper gestoßen, das dieses Problem anspricht. Der Rest ist sehr vage in ihrer Methodik und ich bemühe mich, sie zu replizieren. Dennoch wurde die DWT für die Steganographie weitverbreitet implementiert.

Meine Frage ist, da einige der Literatur, die ich gelesen habe, nicht aufschlussreich war, wie kann das möglich sein? Wie kann man eine Transformation verwenden, die Float-Werte einführt, obwohl die gesamte Steganographie-Methode ganze Zahlen benötigt?

Antwort

7

Eine Lösung, die für mich funktioniert hat, ist die Verwendung der Integer Wavelet Transformation, die auch als lifting scheme bezeichnet wird. die Werte während des gesamten Prozesses sind ganze Zahlen Alle

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

:

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

Und für inverse: Für die Haar-Wavelet, ich habe es gesehen definiert. Der Grund dafür ist, dass die Formeln Informationen sowohl über die geraden als auch die ungeraden Teile der Pixel/Koeffizienten enthalten, so dass kein Informationsverlust durch Abrunden entsteht. Selbst wenn man die Koeffizienten modifiziert und dann die inverse Transformation annimmt, sind die rekonstruierten Pixel immer noch ganze Zahlen.

Beispiel-Implementierung in 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) 

Einige Sprachen bereits haben eingebaute Funktionen für diesen Zweck. Zum Beispiel verwendet Matlab lwt2() und ilwt2() für 2D-Hubschema-Wavelet-Transformation.

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); 

Ein Artikel Beispiel, in dem IWT für Bild Steganographie verwendet wurde, ist Raja, K.B. et. al (2008) Robust image adaptive steganography using integer wavelets.