Bild verkleinern



  • Hey Leute,
    ich brauche in meinem programm eine Funktion mit der ich die größe eines Bildes (bmp) veringern kann. Ich möchte die Funktion grundsetzlich selber schreiben und keine vorgefertigte benutzen. Eigentlich will ich von euch nur wissen ob meine Grundgedanken dazu richtig sind.

    Habe mir das ganze so vorgestellt das ich über das eigentliche Bild ein Raster mit den neuen Masen lege. Dan die Farbwerte Pixel für Pixel eines Rasterfeldes Auslese und den durchschnits Farbwert im entsprechenden Pixel im neuen Bild setze.

    Kann das so funktionieren oder gibt es da eine sinvollere Methode.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89, C99 und C11) in das Forum Rund um die Programmierung verschoben.

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

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Durchschnittswert zu nehmen klingt ok. Da du offensichtlich keine Eigenrecherche zu dem Thema gemacht hast:
    Google: image downscaling algorithm



  • Nein bei google suchen und dann kopieren und einfügen kann ja jeder. Ich wollte ja nur wissen ob mein Grundgedanke zu dem Thema richtig ist bevor ich mich Stunden um Stunden hinsetze und das ganze ausarbeite.



  • Lernen und abschreiben sind zwei verschiedene Dinge. Hier etwas ohne Implementation: https://en.wikipedia.org/wiki/Bilinear_interpolation

    Ansonsten gibt es verschiedene Methoden, die abhaengig vom Einsatzzweck sind.



  • Danke für eure hilfe. Werde es jetzt einfach mal so versuchen wie ich es mir vorstelle. Wenn es nicht funktioniert, weiß ich hinterher wenigstens wie es nicht geht XD.



  • Abbadoon schrieb:

    Eigentlich will ich von euch nur wissen ob meine Grundgedanken dazu richtig sind.

    Habe mir das ganze so vorgestellt das ich über das eigentliche Bild ein Raster mit den neuen Masen lege. Dan die Farbwerte Pixel für Pixel eines Rasterfeldes Auslese und den durchschnits Farbwert im entsprechenden Pixel im neuen Bild setze.

    Das ist einer der Standardalgorithmen für diese Aufgabe, und er heisst "box filter" bzw. "box blur": http://en.wikipedia.org/wiki/Box_blur

    Also ja, der Grundgedanke ist richtig: das ist eine von vielen Möglichkeiten ein Bild zu verkleinern.

    @knivil
    Bilineare Interpolation ist zum Verkleinern nur sehr begrenzt zu gebrauchen. Bei Skalierungsfaktoren << 0.5 ist es kaum besser als Nearest-Pixel.
    (BTW: Ich gehe schon davon aus dass du das weisst, ich wollte es nur trotzdem anmerken, weil ich halt ein Klugscheisser bin, und es ja nicht unbedingt jeder weiss der hier mitliest :D)



  • hustbaer schrieb:

    @knivil
    Bilineare Interpolation ist zum Verkleinern nur sehr begrenzt zu gebrauchen. Bei Skalierungsfaktoren << 0.5 ist es kaum besser als Nearest-Pixel.
    (BTW: Ich gehe schon davon aus dass du das weisst, ich wollte es nur trotzdem anmerken, weil ich halt ein Klugscheisser bin, und es ja nicht unbedingt jeder weiss der hier mitliest :D)

    danke dass du mir das abnimmst, bilinear zum verkleinern kam mir auch spanisch vor.

    @Abbadoon
    etwas wo du nicht so einfach drauf kommst, es aber wichtig sein koennte, gerade bei starken verkleinerungen, ist dass du gamma correct arbeiten musst... sonst wird das kleine bild ausgewaschen aussehen... jetzt musst du doch googlen.



  • Bidde bidde.

    rapso schrieb:

    @Abbadoon
    etwas wo du nicht so einfach drauf kommst, es aber wichtig sein koennte, gerade bei starken verkleinerungen, ist dass du gamma correct arbeiten musst... sonst wird das kleine bild ausgewaschen aussehen... jetzt musst du doch googlen.

    Und danke dass du nachreichst, was ich zwar weiss, wo ich aber zugegebenermassen jetzt auch nicht dran gedacht habe. 🙂

    Gamma-correct FTW! 🤡



  • Hmm... also beim Thema Downsampling einfach so auf Interpolation zu verweisen ohne mal das Abtasttheorem zu erwähnen, finde ich jettz nicht so dolle. Wenn die Abtastfrequenz verringert wird, läuft man bei der "reinen Interpolation" (ohne Tiefpass) Gefahr, Aliasing zu erzeugen.

    Am einfachsten ist natürlich das Downsampling um einen bestimmten Faktor, zum Beispiel Faktor 2. Da müsste man theoretisch einen Tiefpass über seine Daten rüber laufen lassen und dann jedes zweite Sample wegschmeißen. Mit'nem FIR Filter geht das auch in einem Rutsch, ohne dass man die Samples noch berechnen muss, die man dann ja eh wegschmeißt. So könnte das aussehen:

    Signal mit voller Abtastrate
    -+-----+-----+-----+-----+-----+-----+-----+-----+-
     |  2  |  3  |  9  |  9  |  8  |  1  |  7  |  4  |
    -+-----+-----+-----+-----+-----+-----+-----+-----+-
              |     |     |     |     |     |
              |     |     |     |     |     |
            ,---, ,---, ,---, ,---, ,---, ,---,
            |-3 | | 5 | |30 | |30 | | 5 | |-3 | (Skalierung)
             \ /   \ /   \ /   \ /   \ /   \ /
              |     |     |     |     |     |
              +-----+-----+--+--+-----+-----+   (Summe)
                             |
                             |
                           ,----,
                           |1/64|
                            \  /
                             |/
                             |
    -------+-----------+-----------+-----------+-------
    ...    |    ...    |     8     |    ...    |    ...
    -------+-----------+-----------+-----------+-------
                Signal mit halber Abtastrate
    

    Klar, man könnte auch einfach das Mittel von jeweils zwei benachbarten Pixeln bestimmen, das würde aber einem Tiefpassfilter entsprechen, der eine recht flache Flanke hat.

    In folgendem Bild ist ein Vergleich zwischen den beiten Varianten
    - neuen Pixel als Mittel von zweien bestimmen
    - neuen Pixel als gewichtete Summe (siehe oben) von 6 Pixeln bestimmen

    Bildlink

    Man kann also beiliebig viel Aufwand treiben. 🙂
    Die Kunst ist es, das alles flott und gut hinzubekommen.



  • krümelkacker schrieb:

    Signal mit voller Abtastrate
    -+-----+-----+-----+-----+-----+-----+-----+-----+-
     |  2  |  3  |  9  |  9  |  8  |  1  |  7  |  4  |
    -+-----+-----+-----+-----+-----+-----+-----+-----+-
              |     |     |     |     |     |
              |     |     |     |     |     |
            ,---, ,---, ,---, ,---, ,---, ,---,
            |-3 | | 5 | |30 | |30 | | 5 | |-3 | (Skalierung)
             \ /   \ /   \ /   \ /   \ /   \ /
              |     |     |     |     |     |
              +-----+-----+--+--+-----+-----+   (Summe)
                             |
                             |
                           ,----,
                           |1/64|
                            \  /
                             |/
                             |
    -------+-----------+-----------+-----------+-------
    ...    |    ...    |     8     |    ...    |    ...
    -------+-----------+-----------+-----------+-------
                Signal mit halber Abtastrate
    

    diese elegante ascii art ❤
    guter beitrag 👍


Anmelden zum Antworten