Imagen original:
(Las imágenes incluidas son imágenes .png, por lo que no se agregó ninguna distorsión adicional al guardar / cargar para ver)
He usado la transformación D4 de la página 20 de "Ondulaciones en matemáticas" , que es básicamente estos 5 pasos:
Reenviar 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 ;
El inverso:
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 ] ;
Estoy compilando y ejecutando esto usando double
valores de precisión de C ++. Ejecuto esto en las filas de la imagen, luego en las columnas. Utilizo un algoritmo de filtración cruda para eliminar el 90% más bajo de los coeficientes de diferencia en la imagen.
El algoritmo de filtración es:
- Recorrer toda la imagen transformada (como un conjunto de números)
- Encuentre el coeficiente de diferencia más grande (
maxVal
) (en toda la imagen 2d) - Elija
minValToSurvive
como 1% demaxVal
. - Si un coeficiente de diferencia tiene una magnitud menor que
minValToSurvive
, se pone a cero.
Aquí está mi problema es. Cuando elimino solo el 83% de los coeficientes de diferencia más bajos de la imagen (minValToSurvive = 0.01 * maxVal), obtienes esto:
normalizado
Si elimino los pasos de normalización:
s[ IEVEN ] *= ( √3 - 1 ) / √2 ; // REMOVE
s[ IODD ] *= ( √3 + 1 ) / √2 ;
(en las transformaciones fwd y reverse), el resultado después de eliminar el 90% de los componentes es mucho mejor (mucho menos ruido)
Entonces puedo pensar en 1 de 2 problemas:
- Normalizar la imagen por los factores (√3 - 1) / √2 está matando la precisión
- No estoy filtrando correctamente
¿O estoy equivocado? Si estoy filtrando (eliminando componentes insignificantes) incorrectamente, ¿cuál es una mejor manera de filtrar? Si se trata de la precisión de coma flotante, ¿no debería normalizar la transformación en cada paso ?