Anti Aliasing Algorithmus gesucht.



  • Tag!
    Ich suche nen Anti Aliasing Algorithmus, am besten in C programmiert.
    MfG





  • edit: vergisses



  • Das einfachste Anti-Aliasing ist wohl schlichtes Supersampling. Und ohne zu wissen was du denn genau Anti-aliasen willst...



  • Tim schrieb:

    Das einfachste Anti-Aliasing ist wohl schlichtes Supersampling. Und ohne zu wissen was du denn genau Anti-aliasen willst...

    Windows-Bitmaps. Damit der Treppeneffekt rausgeht.



  • Gauß-Filter



  • simple Sache.
    Du gehst jedes pixel durch und errechnest dann den Mittelwert der umgebenden Pixel. Anschließend errechnest du den Unterschied zu dem aktuellen Pixel und multiplizierst das mit einenm Aliaswert (zwischen 0.0 und 1.0)
    Das Ergebnis rechnest du zu dem Pixel dazu und gut ist.



  • Cool, klingt logisch.
    Muss ich da die RGB Werte pro Pixel einzelnd mitteln, oder betrachte ich den Pixel komplett als eine 24 Bit Zahl ( 0xRRGGBB ) ?



  • natürlich rgb gesondert



  • und den aliaswert zwischen 0 und 1 wähle ich frei nach schnauze ?
    das kapier ich noch nicht so ganz 😕





  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Du gehst jedes pixel durch und errechnest dann den Mittelwert der umgebenden Pixel. Anschließend errechnest du den Unterschied zu dem aktuellen Pixel und multiplizierst das mit einenm Aliaswert (zwischen 0.0 und 1.0)
    Das Ergebnis rechnest du zu dem Pixel dazu und gut ist.

    *Das* ist eine lineare Interpolation zwischen Original und Blur (Mittelwert).
    Das hat *sehr wenig* mit Anti-Aliasing zu tun.



  • Kleiner Hintergrund:
    Wenn in einem Signal einmal Aliasse drin sind bekommt man sie nicht mehr weg. Wenn man die Möglichkeit hat, sollte man das Erzeugen des Signal so modifizieren, dass überhaupt keine Aliasse entstehen.
    Ist das nicht möglich oder zu aufwendig muss man eine höhere Abtastrate verwenden, das Signal filtern und dann runterrechnen (oder nur runterrechnen, was an sich auch schon wie ein schlechter Filter fungiert).

    Aliasing entsteht wenn etwas eine höhere Frequenz hat, als das, was durch die Abtastrate dargestellt werden kann (maxmimal die Nyquistfrequenz). Alles überhalb der Nyquistfrequenz bekommt einen Alias unterhalb der Nyquistfrequenz (deshalb auch Aliasing).

    Das als grober Anriss.

    Übertragen auf Bilder bedeutet das, dass du etwas darstellen willst, was kleiner ist als ein Pixel ist, wie z.B. die Kante eines Gegenstandes, etc.

    Möglichkeit Höhere Abtrastrate:
    Du musst die Teile in denen Aliasse entstehen (Kanten von Objekten, Objekte die kleiner als ein Pixel sind, etc.) mit einer höheren Auflösung berechnen und diese dann runterskalieren. Da die Kante aus meinem Beispiel unendlich fein ist, ist jede Form des Oversamplings allerdings nur eine Näherung.

    Möglichkeit das Entstehen von Aliassen verhindern:
    Ein anderer Weg in diesem Fall wäre zu berechnen wieviel Prozent eines jeden Pixels durch welchen Gegenstand bedeckt werden und daraus dann die Farbe zusammenzumischen. IMO ist das aber Praxisfern.



  • Ich suche nen Anti Aliasing Algorithmus (fuer) Windows-Bitmaps. Damit der Treppeneffekt rausgeht.

    Hast Du denn auf die Erzeugung des "Windows-Bitmaps" ueberhaupt Einfluss?



  • der Fragesteller ist Unregistrierter Benutzer und wird daher nicht mehr antworten können



  • Bevor ich einen neuen Thread eröffne, dachte ich, dass es vielleicht besser wäre direkt in diesen zu posten, da ich vor einem ähnlichem Problem stehe.

    Ich habe diverse Füll-Algorithmen(Floodfill4, Scanline-Fill) für Images in mein Program implementiert. Nun würde ich den Algorithmen gerne ein sehr simples Anti-Aliasing spendieren. Mir ist dabei noch nicht ganz klar, wie genau ich vorgehen muss. Den Rand zu finden stellt kein Problem dar. Doch was ist der nächste Schritt?
    Ich nehme mal an, dass ich einfach die Pixel die direkt am Rand liegen, mit der Randfarbe "vermische". Aber wie genau? Und mache ich das nur für eine Pixelreihe? Oder mehrere?

    Vielen Dank schonmal.


  • Mod

    schoen das mal jemand sucht bevor er postet 🙂

    wenn du das einfachste AA suchst, dann kannst du einfach in doppelter aufloesung zeichnen und vor dem ausgeben skalierst du das bild dann auf die haelfte indem du pro 2x2 pixel den mittelwert bildest.

    wenn du das weiter optimieren willst, haengt es ziemlich davon ab was und wie du zeichnest (und vielleicht wie tollerant du gegenueber kleinen fehlern bist).



  • rapso schrieb:

    schoen das mal jemand sucht bevor er postet 🙂

    wenn du das einfachste AA suchst, dann kannst du einfach in doppelter aufloesung zeichnen und vor dem ausgeben skalierst du das bild dann auf die haelfte indem du pro 2x2 pixel den mittelwert bildest.

    wenn du das weiter optimieren willst, haengt es ziemlich davon ab was und wie du zeichnest (und vielleicht wie tollerant du gegenueber kleinen fehlern bist).

    Also wenn ich dich jetzt richtig verstanden habe, dann ist diese Variante nicht so einfach möglich. Bzw. wie zeichnet man in doppelter Auflösung? das würde doch bedeuten, dass ich das komplette Bild in dieser Aufklösung zeichnen müsste. Das möchte ich nicht. Wie gesagt : Ziel der "Übung" ist es das Anti-Aliasing direkt in den Floodfill zu integrieren.


  • Mod

    toxn schrieb:

    rapso schrieb:

    schoen das mal jemand sucht bevor er postet 🙂

    wenn du das einfachste AA suchst, dann kannst du einfach in doppelter aufloesung zeichnen und vor dem ausgeben skalierst du das bild dann auf die haelfte indem du pro 2x2 pixel den mittelwert bildest.

    wenn du das weiter optimieren willst, haengt es ziemlich davon ab was und wie du zeichnest (und vielleicht wie tollerant du gegenueber kleinen fehlern bist).

    Also wenn ich dich jetzt richtig verstanden habe, dann ist diese Variante nicht so einfach möglich. Bzw. wie zeichnet man in doppelter Auflösung?

    indem man jede coordinate vor dem zeichnen *2 nimmt. deswegen ist es ja die einfachste art.

    das würde doch bedeuten, dass ich das komplette Bild in dieser Aufklösung zeichnen müsste. Das möchte ich nicht.

    gruende?

    Wie gesagt : Ziel der "Übung" ist es das Anti-Aliasing direkt in den Floodfill zu integrieren.

    ein floodfill hat an sich kein anti aliasing. jeder punkt einer flaeche wird durch einen anderen ersetzt.

    Antialiasing wendet man auf vector funktionen ein, also beim umwandeln von mathematischen beschreibungen in bilder (quasi abtasten von signalen).


Anmelden zum Antworten