Das „Normalisieren“ meiner D4-Wavelet-Transformation bei jedem Schritt verringert die endgültige Bildqualität

7

Original Bild:

Originalbild vor der Transformation und Filterung

(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 doublePrä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 minValToSurviveals 1% von maxVal.
  • 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

d4 83% Reduktion 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)

90% Reduktion, nicht normalisiert

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 ?

Bobobobo
quelle

Antworten:

3

Die richtige Antwort ist, dass Sie jeden der Update / Predict-Schritte für das Eingangssignal vollständig ausführen müssen, bevor Sie das nächste Update / Predict durchführen. Was ich tat, war durch das Signal zu gehen und jedes Update / Predict durchzuführen, während ich gehe.

Auf Seite 158 von "Ripples" finden Sie eine Referenzimplementierung.

// 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 ;
  }
}

Die D4-Transformation der 98% 0:

d4 98%

Bobobobo
quelle
Ein großes Lob für die Veröffentlichung des Updates zu Ihrer Forschung! Diese Seite hat noch keine große Auswahl an Experten gesammelt, daher kann nicht jede Frage beantwortet werden, aber es ist großartig, dass Sie zurückgekommen sind und Ihre Ergebnisse geteilt haben. Ich bin sicher, dass es für andere nützlich sein wird, die nach ähnlichen Informationen suchen.
Phonon