对LL波段系数中的图像和水印嵌入进行离散小波变换,当再次执行IDWT-DWT时,数据会丢失吗?

时间:2011-07-12 18:37:20

标签: watermark wavelet dwt time-frequency

我正在编写一个图像水印系统,通过使用离散小波变换转换图像的亮度通道,然后修改DWT输出的LL波段中的系数来隐藏图像低频带中的水印。然后我做一个反向DWT并重建我的图像。

我遇到的问题是当我修改DWT输出中的系数,然后是反DWT,然后再修改DWT时,修改后的系数完全不同。

例如,2比例DWT的LL波段中的一个输出系数是-0.10704,我将该系数修改为16.89,然后对我的数据执行IDWT。然后我拿出了IDWT的输出并再次对它进行了DWT,我修改为16.89的系数变为0.022。

我很确定DWT和IDWT代码是正确的,因为我已经针对其他库测试了它,并且当滤波器系数和其他参数相同时,每个变换的输出都匹配。 (由于舍入误差可以预期)

我遇到的主要问题是我可能不太了解DWT,我认为DWT和IDWT应该是合理的无损(除了舍入错误等),但这似乎不是这里的情况。

我希望更熟悉变换的人可以指出我可能存在的问题,是否有可能因为我的其他子带(LH,HL,HH)中该系数的系数无关紧要而我丢失了数据?如果是这样,我如何确定可能发生的系数?

我的嵌入功能如下,系数在LL波段中选择,如果所选位置的LH,HH或HL波段的绝对值大于该波段的平均值,则“强”被确定为真。相应的子带。

//If this evaluates to true, then the texture is considered strong.
if ((Math.Abs(LH[i][w]) >= LHmean) || (Math.Abs(HL[i][w]) >= HLmean) || (Math.Abs(HH[i][w]) >= HHmean)) 



    static double MarkCoeff(int index, double coeff,bool strong)
    {
        int q1 = 16;
        int q2 = 8;
        int quantizestep = 0;
        byte watermarkbit = binaryWM[index];


        if(strong)
            quantizestep  = q1;
        else
            quantizestep = q2;

        coeff /= (double)quantizestep;
        double coeffdiff = 0;
        if(coeff > 0.0)
            coeffdiff = coeff - (int)coeff;
        else
            coeffdiff = coeff + (int)coeff;

        if (1 == ((int)coeff % 2))
        {
            //odd
            if (watermarkbit == 0)
            {
                if (Math.Abs(coeffdiff) > 0.5)
                    coeff += 1.0;
                else
                    coeff -= 1.0;
            }
        }
        else
        {
            //even
            if (watermarkbit == 1)
            {
                if (Math.Abs(coeffdiff) > 0.5)
                    coeff += 1.0;
                else
                    coeff -= 1.0;
            }
        }

        coeff *= (double)quantizestep;

        return coeff;
    }

0 个答案:

没有答案