Original Bild:
(Die enthaltenen Bilder sind PNG-Bilder, daher wurden beim Speichern / Hochladen keine zusätzlichen Verzerrungen zum Anzeigen hinzugefügt.)
Ich habe die D4-Transformation von Seite 20 von "Ripples in Mathematics" verwendet , die im Grunde diese 5 Schritte umfasst:
Vorwärts 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 ;
Das Gegenteil:
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 ] ;
Ich kompiliere und führe dies mit double
Präzisionswerten aus C ++ aus. Ich führe dies in den Zeilen des Bildes und dann in den Spalten aus. Ich verwende einen Rohfiltrationsalgorithmus, um die niedrigsten 90% der Differenzkoeffizienten im Bild zu entfernen.
Der Filtrationsalgorithmus lautet:
- Durchlaufen Sie das gesamte transformierte Bild (als eine Reihe von Zahlen).
- Finden Sie den größten Differenzkoeffizienten (
maxVal
) (im gesamten 2D-Bild) - Wählen Sie
minValToSurvive
als 1% vonmaxVal
. - Wenn ein Differenzkoeffizient eine Größe kleiner als hat
minValToSurvive
, wird er auf Null gesetzt.
Hier ist mein Problem. Wenn ich nur 83% der niedrigsten Differenzkoeffizienten aus dem Bild entferne (minValToSurvive = 0,01 * maxVal), erhalten Sie Folgendes:
normalisiert
Wenn ich die Normalisierungsschritte entferne :
s[ IEVEN ] *= ( √3 - 1 ) / √2 ; // REMOVE
s[ IODD ] *= ( √3 + 1 ) / √2 ;
(sowohl bei der fwd- als auch bei der umgekehrten Transformation) ist das Ergebnis nach dem Entfernen von 90% der Komponenten viel besser (viel weniger Rauschen)
Ich kann mir also 1 von 2 Problemen vorstellen:
- Das Normalisieren des Bildes durch die Faktoren (√3 - 1) / √2 bringt die Präzision zum Erliegen
- Ich bin nicht Filterung richtig
Oder liege ich falsch? Wenn ich falsch filtere (unbedeutende Komponenten entferne), wie kann ich dann besser filtern? Wenn es sich um die Gleitkommapräzision handelt, sollte ich die Transformation dann nicht bei jedem Schritt normalisieren ?