2D FIR-Filter mit bestimmter Grenzfrequenz für Bildverarbeitung entwerfen



  • Hallo Alle,
    ich will einen Tiefpassfilter für ein Bild entwerfen, um bei nachträglicher Skalierung Alias zu vermeiden. Die Bilder sollen immer auf 64x64 Pixel skaliert werden. Die Grenzfrequenz ist somit immer die gleiche und liegt bei 32Hz. Natürlich handelt es sich um Ortsfrequenzen. Wie Filter für Bilder allgemein aussehen, ist mir bekannt. Wie bekomme ich jedoch einen Filter, der ein Bild so weichgezeichnet, dass es nur noch Frequenzen <=32 Hz enthält?
    Läßt sich so etwas überhaupt mit einem festen Filter-Kernel (Größe und Koeffizienten) realisieren. Oder ist das auch immer abhängig von der Größe des Bildes in Pixeln?

    Grüße



  • wie genau meinst du das mit den 32 schwingungen pro sekunde bezogen auf ein bild?



  • Er sagt doch, es handelt sich um eine Ortsfrequenz. Eine Schwingung, die innerhalb des Bildes öfter als 32mal einen schwarz-weiß-schwarz-Übergang hat, lässt sich auf dem 64x64-Bild nicht darstellen.



  • ich glaube ich versteh immer noch nicht, oder die antwort ist zu einfach.

    Man machst das, indem man das bild auf 6464 runterskaliert und dann wieder hochskalliert, auf die vorherige aufloesung.
    runterskalieren kann man indem man einfach pro pixel (des 64
    64 bildes) alle werte/samples/pixel (die unter diesen pixel auf dem grossen bild sind, also hochprojeziert) aufakkumuliert und durch die anzahl der samples teilt.

    sorry falls ich noch etwas uebersehe 😞



  • Bael42 schrieb:

    Oder ist das auch immer abhängig von der Größe des Bildes in Pixeln?

    Natürlich ist es das, die Grenzfrequenz ist in reziproken skalierten Pixeln konstant, muss also in unskalierten reziproken Pixeln von dem skalierungsfaktor abhängen. Aber wieso berechnest du nicht einfach die gewünschte Grenzfrequenz und lässt einen normalen Tiefpass mit dieser GF darauf los?



  • rapso schrieb:

    Man machst das, indem man das bild auf 6464 runterskaliert und dann wieder hochskalliert, auf die vorherige aufloesung.
    runterskalieren kann man indem man einfach pro pixel (des 64
    64 bildes) alle werte/samples/pixel (die unter diesen pixel auf dem grossen bild sind, also hochprojeziert) aufakkumuliert und durch die anzahl der samples teilt.

    Nein, das ergibt Aliasing. Einfach nur akkumulieren und durch Anzahl der Samples teilen hat leider die unschöne Eigenschaft, dass dabei manchmal eine Farbumkehr stattfinden kann, da bestimmte Frequenzen invertiert werden. Genau deswegen will er ja erst filtern und dann skalieren.



  • Jester schrieb:

    Nein, das ergibt Aliasing.

    aliasing beim runtersklieren? meinst du moire effekt?

    ...Farbumkehr ...

    emm.. ich bin zu doof das zu verstehen und google liefert mir in dem zusammenhang auch nur negativ funktionen fuer photos. was meinst du mit Farbumkehr?

    sorry Bael42 dass ich deinen thread missbrauche 😉



  • @Bael42: Ich weiß auch nicht, was man da typischerweise für einen Filter verwendet. ...ich würde von einem Gaussfilter ausgehen, aber die Frage ist halt, wie man den parametrisiert.

    Du kannst das ganze testweise einfach mal im Frequenzraum machen. Da sollte es am einfachsten sein, die störenden Frequenzen einfach wegzuschneiden und dann alles wieder in den Ortsraum zu transformieren.



  • raps schrieb:

    Jester schrieb:

    Nein, das ergibt Aliasing.

    aliasing beim runtersklieren? meinst du moire effekt?

    ne, dann hätte ich ja moiré-effekt geschrieben. Ich meine schon Aliasing. Das passiert üblicherweise dann, wenn man ein Signal zu niederfrequent abtastet. Daher entfernt man hochfrequente Signalanteile ja vor dem Skalieren.

    Dafür ist aber die gleitende Mittelung eben nicht geeignet. Das liegt daran, dass die Übertragsungsfunktion stellenweise negativ ist, also manche Frequenzen verkehrt werden.

    Stell's Dir einfach in 2D vor: Die gleitende Mittelung hat als Impulsantwort einfach ein Rechteck. Daher ist die Fouriertransformierte sowas wie sin(w)/w mit geeigneten Konstanten dabei. Das schwingt zum einen richtig schön Lange (das heißt hohe Frequenzen werden nur bedingt unterdrückt) und zweitens ist es stellenweise negativ, da findet dann besagte Kontrastumkehr statt: aus schwarz wird weiß und umgekehrt.

    Nimm mal nen Siemensstern und filtere den mit Mittelwert-Filterung, dann siehste dass im Inneren stellenweise eine Kontrastumkehr stattfindet.

    Der von Gregor angesprochene Gaußfilter hat diese Probleme nicht, seine Übertragungsfunktion fällt schnell ab (hohe Frequenzen werden gut unterdrückt) und er ist stets positiv.



  • Dumme Frage von einem, der von der ganzen Filtertheorie nicht viel versteht:
    Wieso erst filtern und dann skalieren, wieso nicht gleich beides zur selben Zeit? Dass ein Box-Filter nicht in Frage kommt versteht sich...
    Ich würde sagen die Größe des Filters ist beim Skalieren von einer variablen Bildgröße auf eine feste immer variabel. Dimensioniert man der Filter nicht üblicherweise so, dass der zu berechnende Pixel im Zielbild in der Filterfunktion bei 0 liegt, der rechts daneben bei 1 etc.? Die Pixel im Quellbild liegen je nach Skalierungsfaktor irgendwo dazwischen.
    Der Gaußfilter könnte evtl. zu verschwommenen Ergebnissen führen.
    geloescht

    Disclaimer: Alle Annahmen in meinem Post basieren auf meinem unvollständigen Verständnis des Kapitels 7 von "physically based rendering".



  • geloescht schrieb:

    Dumme Frage von einem, der von der ganzen Filtertheorie nicht viel versteht:
    Wieso erst filtern und dann skalieren, wieso nicht gleich beides zur selben Zeit?

    Klar, Du mußt das Bild natürlich nur an den Stellen berechnen, die Du nachher auch sampelst. Das ändert aber nichts daran, dass Du den Filter geeignet entwerfen mußt. Es schadet nicht für den Entwurf erstmal beide Phasen getrennt zu betrachten.

    Natürlich muß der Filter an die Bildgröße angepasst werden. Ich denke, es ist am einfachsten anzunehmen, dass beide Bilder Höhe und Breite 1 haben.



  • Hallo alle Zusammen,
    ich war ne Woche weg und konnte nicht so recht antworten. Aber das werde ich jetzt nachholen.
    Das Bild muß genauso wie ein Audiosignal Tiefpass-gefiltert werden, bevor es skaliert wird. Nur jeden x-ten Pixel zu nehmen würde das Shannon-Theorem verletzten und es würde zu Alias führen. Also habe ich überlegt, was ich für einen Filter brauche wenn ich ein beliebiges Bild auf 64x64 Pixel sklieren will. Ich habe mich hierbei an einem eindimensionalen Signal (Audio) orientiert (Ist in mancherlei Hinsicht verständlicher für mich). Was jedoch entspricht der Abtastrate in der Zeit? Ist das Pixel/cm? oder ist das die Länge in Pixeln?

    Im übrigen habe ich sowohl mit Gaussfiltern als auch mit der Si-Funktion im Bildbereich gefaltet. Da ich aber immer noch an der Grenzfrequenz hänge, lieferten beide Ergebnisse nach dem Skalieren immer noch Alias-Artefakte.
    Grüße und Danke für die vielen Antworten.

    @Jester PS: Ich betrachte die Prozesse getrennt, da ich die Intel IPP Funktionen nutzen will und der IppiResize sich nicht um Alias kümmert



  • Bael42 schrieb:

    Nur jeden x-ten Pixel zu nehmen würde das Shannon-Theorem verletzten und es würde zu Alias führen.

    Ja, deswegen schrieb ich dass man normalerweise von der kleineren aufloesung auf die groessere projeziert und alle darunter liegenden pixel aufakkumuliert. das nennt man bei graphikkarten "anisotropic filtering" wenn es in echtzeit gemacht wird (was deiner idee vom abtasten gleichkommt).
    wenn man das offline macht, kann man sehr genau die projektion ausrechnen und muss dann nicht mit diskreten samplen arbeiten, sondern kann wirklich die gewichtung der pixel andhand der abdeckung berechnen, dann kommst du ohne "abtastraten" klar, was bessere ergebnisse liefern kann.
    (wobei ich weiter nicht weiss wie dabei aliasing auftretten koennte, wie jester meinte, assuerm moire effekt).

    Ein blur filter wird dich nicht immer gluecklich machen, es gibt faelle da sieht ein sharpeningfilter besser aus (z.b. wenn du z.b. geometrische flaechen hast bei denen du die kontruren noch gut erkennen willst), das ist sehr abhaengig vom bild und nicht wirklich etwas mathematisches/algorithmisches.

    schau mal nach (windowed) sinc und kaiser filter, damit kann man gut auf den projezierten bereichen filtern, wobei es sich manchmal anbietet das 'window'groesser zu machen als den eigentlichen bereich.



  • Ich finde keine Option, wie ich nen Bild hochladen kann. Wenn es dich jedoch interessiert, dann lade dir mal die Zonenplatte in Matlab/Octave:

    http://upload.wikimedia.org/wikipedia/commons/6/66/Zonenplatte_Cosinus.png

    und verleiner das Bild, indem du z.B. jeden 20sten Pixel nimmst. Dann äußert sich das Alias durch Ringe die zuvor nicht da waren. Ich denke, das ist noch was anderes als der moire-effekt. Dieser entsteht eher durch Überlagerung mehrerer Muster und damit verbundene Verstärkung einzelner "Partien".

    Nicht desto trotz werde ich mal den von rapso beschriebenen Ansatz verfolgen.
    Grüße



  • Bael42 schrieb:

    Ich finde keine Option, wie ich nen Bild hochladen kann. Wenn es dich jedoch interessiert, dann lade dir mal die Zonenplatte in Matlab/Octave:

    http://upload.wikimedia.org/wikipedia/commons/6/66/Zonenplatte_Cosinus.png

    und verleiner das Bild, indem du z.B. jeden 20sten Pixel nimmst. Dann äußert sich das Alias durch Ringe die zuvor nicht da waren.

    was hat das damit zu tun dass man alle pixel des groesseren bildes auf das man einen pixel des verkleinerten pixels mappt, aufakkumuliert und mittelt? (oder hatte ich mich nur unverstaendlich ausgedrueckt? 😕 )
    bei 20x verkleinerung hast du somit nicht jeden 20sten, sondern 400pixel genommen.

    Ich denke, das ist noch was anderes als der moire-effekt. Dieser entsteht eher durch Überlagerung mehrerer Muster und damit verbundene Verstärkung einzelner "Partien".

    undersampling, oder kurz, moire-effekt, wuerde _ich_ das nennen 😕



  • rapso schrieb:

    Ich denke, das ist noch was anderes als der moire-effekt. Dieser entsteht eher durch Überlagerung mehrerer Muster und damit verbundene Verstärkung einzelner "Partien".

    undersampling, oder kurz, moire-effekt, wuerde _ich_ das nennen 😕

    Durch gleitende Mittelung werden die hohen Frequenzen nicht unterdrückt. Wenn Du nun abtastest verletzt Du die Abtastbedingung und die periodisch fortgesetzten Spektren überlagern sich -- Aliasing. Das passiert sogar dann, wenn Du die gleitende Mittelung benutzt.

    Aber was red ich hier überhaupt, Du wirst es mir eh nicht glauben. Probier's also entweder aus oder besorg Dir das mathematische Handwerkszeug um es nachzurechnen.



  • jester schrieb:

    Durch gleitende Mittelung werden die hohen Frequenzen nicht unterdrückt. Wenn Du nun abtastest verletzt Du die Abtastbedingung und die periodisch fortgesetzten Spektren überlagern sich -- Aliasing.

    Der Gleitende Mittelwert ist doch aber ein Tiefpass?! Nur ist die Transferfunktion zu hohen Frequenzen nicht null. Siehe hier Figure 11.1a:

    http://books.google.de/books?id=qUeecNvfn0oC&pg=PA303&lpg=PA306

    Daher die Idee, z.B. einen Gaussfilter zu nutzen, welcher ähnlich dem Binominialfilter (Figure 11.1 b) eine geeigntere Transferfunktion hat.

    rapso schrieb:

    was hat das damit zu tun dass man alle pixel des groesseren bildes auf das man einen pixel des verkleinerten pixels mappt, aufakkumuliert und mittelt?

    Gar nichts! Ich schrieb ja auch, dass ich genau das ausprobieren werde.

    (oder hatte ich mich nur unverstaendlich ausgedrueckt? )

    duchaus nicht

    bei 20x verkleinerung hast du somit nicht jeden 20sten, sondern 400pixel genommen.

    Das Ganze war als Beispiel gedacht, um mich verständlicher zu machen. Ich kenne den Moire Effekt. Um das Ganze zu verstehen muß, ich aber über die Dinge diskutiern und ich lasse mich gern eines besseren überzeugen. Nichts davon muß persönlich genommen werden.
    Habt Geduld mit den Unwissenden!
    Grüße



  • Bael42 schrieb:

    jester schrieb:

    Durch gleitende Mittelung werden die hohen Frequenzen nicht unterdrückt. Wenn Du nun abtastest verletzt Du die Abtastbedingung und die periodisch fortgesetzten Spektren überlagern sich -- Aliasing.

    Der Gleitende Mittelwert ist doch aber ein Tiefpass?! Nur ist die Transferfunktion zu hohen Frequenzen nicht null.

    Ja, es ist ein Tiefpass, aber kein guter. Die Frequenzen sind eben noch da und können daher Aliasing hervorrufen. Zudem sieht man, dass die Übertragungsfunktion stellenweise negativ ist, was zu besagter Kontrastumkehr führt.



  • @rapso,
    ich hab da noch was gefunden. Auch wenn das nur Wikipedia ist, beschreibt es genau den Effekt, welchen ich habe incl. Illustration.

    http://de.wikipedia.org/wiki/Alias-Effekt

    Die Intel IPP Funktion IppResize bietet verschiedene Interpolationsmethoden. Mitunter Supersamling. Diese Methode bringt das wenigste Aliasing. Allerdings geht es eben nicht ganz ohne. Entspricht das dem Aufakkumulieren?
    Grüße


Anmelden zum Antworten