在隐写术中,least significant bit (LSB) substitution方法将 secret 位嵌入到覆盖媒体(例如,图像像素)中的位的位置。在某些方法中,获取图像的Discrete Wavelet Transform(DWT),并将 secret 位嵌入DWT系数中,然后使用反变换来重建隐身图像。
但是,DWT会产生浮点系数,并且对于LSB替换方法,需要整数值。我读过的大多数论文都使用2D Haar Wavelet,但是,它们的方法尚不清楚。我已经看到了根据低通滤波器和高通滤波器定义的变换(浮点变换),或者采用了对值的总和和差值,或者平均值和均值差值等。
更明确地,无论是正向变换还是逆向变换(但不一定取决于所使用的公式,两者都将出现),最终会出现浮点数。我不能将它们用于系数,因为替换将不起作用,而我也无法将它们用于重构像素,因为图像需要整数值进行存储。
例如,让我们将一对像素A
和B
视为一维数组。低频系数由总和即s = A + B
定义,而高频系数由差即d = A - B
定义。然后,我们可以使用B = (s - d) / 2
和A = s - B
重建原始像素。但是,在与系数进行任何位纠结之后,s - d
可能不再均匀,并且浮点值将出现在重构的像素中。
对于2D情况,将对行和列分别应用1D变换,因此最终将在某处进行除以4。这会导致浮点余数分别为.00,.25,.50和.75。我只遇到了解决此问题的one paper。其余方法的方法非常模糊,我很难复制它们。但是,DWT已广泛用于图像隐写术。
我的问题是,由于我读过的一些文献并没有启发性,这怎么可能?如何使用引入浮点值的转换,而整个隐写方法需要整数?
最佳答案
对我有用的一种解决方案是使用整数小波变换,其中一些也称为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.