我正在编写一个图像水印系统,通过使用离散小波变换转换图像的亮度通道,然后修改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;
}