原图:
(包含的图像是 .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 ] ;
我正在使用double
C++ 中的精度值编译和运行它。我在图像的行上运行它,然后是列。我使用粗略的过滤算法来去除图像中最低 90% 的差异系数。
过滤算法为:
- 遍历整个转换后的图像(作为一组数字)
- 找到最大的差异系数 (
maxVal
)(在整个2d 图像中) - 选择
minValToSurvive
为 的 1%maxVal
。 - 如果差异系数的大小小于
minValToSurvive
,则将其归零。
这是我的问题。当我从图像中仅删除 83% 的最低差分系数 (minValToSurvive=0.01*maxVal) 时,您会得到:
归一化
如果我删除规范化步骤:
s[ IEVEN ] *= ( √3 - 1 ) / √2 ; // REMOVE
s[ IODD ] *= ( √3 + 1 ) / √2 ;
(在正向和反向变换中),去除 90% 的分量后的结果要好得多(噪声要少得多)
所以我可以想到 2 个问题中的 1 个:
- 通过 ( √3 - 1 ) / √2 因子对图像进行归一化正在杀死精度
- 我没有正确过滤
还是我错了?如果我错误地过滤(删除无关紧要的组件),有什么更好的过滤方法?如果是浮点精度,那么我不应该在每一步都对变换进行归一化吗?