在每一步“归一化”我的 D4 小波变换会降低最终图像质量

信息处理 噪音 小波
2021-12-28 03:46:37

原图:

变换滤波前的原图

(包含的图像是 .png 图像,因此在保存/上传以供查看时没有添加额外的失真)

我使用了“数学中的涟漪”第 20 页的 D4 变换,基本上是这 5 个步骤:

转发d4:

c1 = √3 / 4.0 ;
c2 = (√3 - 2) / 4.0 ;
s[ IEVEN ] += √3 * s[ IODD ] ;
s[ IODD ] -= c1*s[ IEVEN ] + c2*s[ IPREVEVEN ] ;
s[ IEVEN ] -= s[ INEXTODD ] ;
s[ IEVEN ] *= ( √3 - 1 ) / √2 ;
s[ IODD ] *= ( √3 + 1 ) / √2 ;

逆:

c1 = √3 / 4.0 ;
c2 = (√3 - 2) / 4.0 ;
s[ IODD ] *= ( √3 - 1 ) / √2 ;
s[ IEVEN ] *= ( √3 + 1 ) / √2  ;
s[ IEVEN ] += s[INEXTODD] ;
s[ IODD ] += c1*s[ IEVEN ] + c2*s[IPREVEVEN] ;
s[ IEVEN ] -= √3 * s[ IODD ] ;

我正在使用doubleC++ 中的精度值编译和运行它。我在图像的行上运行它,然后是列。我使用粗略的过滤算法来去除图像中最低 90% 的差异系数。

过滤算法为:

  • 遍历整个转换后的图像(作为一组数字)
  • 找到最大的差异系数 ( maxVal)(在整个2d 图像中)
  • 选择minValToSurvive为 的 1% maxVal
  • 如果差异系数的大小小于minValToSurvive,则将其归零。

这是我的问题。当我从图像中仅删除 83% 的最低差分系数 (minValToSurvive=0.01*maxVal) 时,您会得到:

归一化

d4 减少 83% 归一化

如果我删除规范化步骤:

s[ IEVEN ] *= ( √3 - 1 ) / √2 ; // REMOVE
s[ IODD ] *= ( √3 + 1 ) / √2 ;

(在正向和反向变换中),去除 90% 的分量后的结果好得多(噪声要少得多)

减少 90%,未标准化

所以我可以想到 2 个问题中的 1 个:

  • 通过 ( √3 - 1 ) / √2 因子对图像进行归一化正在杀死精度
  • 我没有正确过滤

还是我错了?如果我错误地过滤(删除无关紧要的组件),有什么更好的过滤方法?如果是浮点精度,那么我不应该在每一步都对变换进行归一化吗?

1个回答

正确的答案是您必须在执行下一个更新/预测之前完全对输入信号执行每个更新/预测步骤。我正在做的是遍历信号,并在进行时执行每个更新/预测。

在“涟漪”的第 158 页,有一个参考实现。

// s is the signal
#define IEVEN (2*j)
#define IODD (2*j + i)
for( int i = 1 ; i <= n/2 ; i *= 2 )
{
  for( int j = 0 ; j <= n/2 - i ; j += i ) // Must do this Predict step COMPLETLEY
    s[ IEVEN ] += √3 * s[ IODD ] ;

  for( int j = 0 ; j <= n/2 - i ; j += i ) // Then this one..
  {
    int prevEvenIndex = IPREVEVEN ;
    s[ IODD ] -= d4c1*s[ IEVEN ] + d4c2*SAFE_PREV(s,prevEvenIndex) ;
  }

  for( int j = 0 ; j <= n/2 - i ; j += i )
  {
    int nextOddIndex = INEXTODD ;
    s[ IEVEN ] -= SAFE_NEXT(s,nextOddIndex) ;
  }

  for( int j = 0 ; j <= n/2 - i ; j += i )
  {
    s[ IEVEN ] *= d4normEvens ;
    s[ IODD ] *= d4normOdds ;
  }
}

98% 0 的 D4 变换:

d4 98%