【问题标题】:How can DWT be used in LSB substitution steganographyDWT如何用于LSB替换隐写术
【发布时间】:2016-08-18 01:40:33
【问题描述】:

在隐写术中,least significant bit (LSB) substitution 方法将秘密位嵌入覆盖介质中的位,例如图像像素。在一些方法中,获取图像的Discrete Wavelet Transform(DWT)并将秘密比特嵌入DWT系数中,然后使用逆变换重建隐秘图像。

但是,DWT 产生浮点系数,对于 LSB 替换方法,整数值是必需的。我读过的大多数论文都使用 2D Haar Wavelet,但是,他们并不清楚他们的方法。我已经看到变换是根据低通和高通滤波器(浮点变换)定义的,或者取对值的和和差,或者平均值和平均差等。

更明确地说,无论是在正向变换还是逆变换中(但不一定在两者中都取决于所使用的公式)最终会出现浮点数。我不能将它们用于系数,因为替换不起作用,我不能将它们用于重构像素,因为图像需要整数值进行存储。

例如,让我们将一对像素 AB 视为一维数组。低频系数由和定义,即s = A + B,高频系数由差定义,即d = A - B。然后我们可以用B = (s - d) / 2A = s - B 重建原始像素。然而,在对系数进行任何一点操作之后,s - d 可能不再是甚至重建像素的浮点值。

对于 2D 情况,1D 变换分别应用于行和列,因此最终会在某处发生除以 4。这可能导致浮点余数为 0.00、0.25、0.50 和 0.75 的值。我只遇到过解决此问题的one paper。其余的在他们的方法上非常模糊,我很难复制它们。然而,DWT 已被广泛用于图像隐写术。

我的问题是,由于我读过的一些文献没有启发性,这怎么可能?如何使用引入浮点值的转换,而整个隐写方法需要整数?

【问题讨论】:

    标签: steganography haar-wavelet dwt wavelet-transform


    【解决方案1】:

    对我有用的一个解决方案是使用整数小波变换,有些人也将其称为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() 进行二维提升方案小波变换。

    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.

    【讨论】:

      猜你喜欢
      • 2018-09-13
      • 2016-05-25
      • 2015-07-25
      • 2018-08-01
      • 2018-10-03
      • 2018-10-02
      • 1970-01-01
      • 2013-08-18
      相关资源
      最近更新 更多