[GDI+] Bildaufteilung, Bildformat, Ideen

  • Guten Tag,

    Vorab eine Info: Das hier soll eher ein "Ideen und Anregungen" Thread werden.

    Grundidee: Erstellung eines eigenen Bildformats

    Benötigte Elemente: (meiner Meinung nach)

    - Bildaufteilungsmethode (Teilt ein Bild in kleine Einzelbilder die einfacher kodiert werden können als das Gesamtbild)

    - Bildkodierungsmethode (Kodiert ein Einzelbild mit möglichst geringer Datenmenge)

    - Sonstiges (Qualitätseinstellungen von unkenntlichem Pixelsalat bis verlustfrei, sonstiges)

    Im Anhang befindet sich ein Skript, welches die Aufteilung eines Bildes in Teilbilder ermöglicht (damit wird Part 1 des Bildformats in Angriff genommen). Es sind extrem viele Kommentare und ganze Textpassagen vorhanden die ich hier nicht nochmal alle wiederholen möchte. Jeder ist dazu eingeladen Verbesserungen, Vorschläge und alle Ideen (auch mysteriöse die auf den ersten Blick keinen Sinn ergeben) einzubringen.

    Eine Umsetzung in ASM ist erstmal völlig drittrangig, da das Grundgerüst vermutlich noch mehrfach umgeworfen wird. Die native AutoIt-Version braucht auf meinem PC für "kleine" Testbilder unter 20 Sekunden (und ich wette da kann man durch Optimierungen noch 50%+ rausholen) und ist daher gut geeignet um alles mögliche auszuprobieren.

    Edit1: Die aktuelle Version ist selbstverständlich völlig unausgereift und wird wahrscheinlich manchmal abstürzen. In diesem Fall bitte unbedingt versuchen den Fehler reproduzierbar hier im Thread zu zeigen.

    Viel Spaß mit dem Skript, ich freue mich auf jeden der Lust hat daran herumzubasteln ;)

    lg

    Mars

  • Hallo Mars !

    Interessantes Projekt, insbesondere die theoretischen Aspekte !

    Ich habe das Programm mal bei mir durchlaufen lassen. Hier die Ergebnisse (keine Ahnung, ob Dir das irgendwie hilft) :

    Bildname : Bims.png

    Auflösung Originalbild : 100 x 100 DPI , Komprimierung = PNG - ZIP

    Assembled.png :

    Count: 256

    Time: 3.86s

    Auflösung : 120 x 120 DPI

    Bildname : Mona.png

    Auflösung Originalbild : 203 x 203 DPI , Komprimierung = PNG - ZIP

    Assembled.png :

    Count: 256

    Time: 13.67s

    Auflösung : 120 x 120 DPI

    Bildname : Mona512.png

    Auflösung Originalbild : 203 x 203 DPI , Komprimierung = JPEG, quality: 84, subsampling ON (2x2)

    Hier erhalte ich mit dem Anzeigeprogramm Irfanview folgende Meldung : "Mona512.png ist eine JPG Datei mit falscher Erweiterung"

    Assembled.png :

    Count: 256

    Time: 52.51s

    Auflösung : 120 x 120 DPI

    Bildname : eigene 'Test.png'

    Dateigröße : 1,83 MB

    Auflösung Originalbild : 300 x 300 DPI , Komprimierung = PNG - ZIP , 1200 x 838 Pixel

    Assembled.png :

    Größe 2,56 MB

    Count: 256

    Time: 284.22s

    Auflösung : 120 x 120 DPI

    Den Test mit einer 5 MB großen .jpg-Datei habe ich nach ca. 25 min. abgebrochen -> kein Fehler, war wohl noch am Rechnen ;)

    Anregung :

    Könntest Du in den Dateinamen der .zip und der imagesplit.au3 eine Versionsnummer integrieren (z.B. imagesplit_1_0_0.au3).

    Ich vermute, da werden noch diverse neuere Programmstände kommen, und so kann man sie leichter unterscheiden.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Ganz vertiefen werde ich mich in das Skript wahrscheinlich nicht - das bedarf dann doch einigen Zeitaufwandes.

    Zur Ableitung der Komplexität eines Bildbereiches habe ich eventuell aber eine Anmerkung:

    Du verwendest die Standardabweichung als Maß hierfür. Ein Bild welches nur aus einer schwarzen Hälfte und einer weißen Hälfte besteht, hätte bei dieser Herangehensweise die höchste Standardabweichung. Ist ein solches Bild aber gleichbedeutend mit "komplex"?

    Stattdessen berechnet man für derartige Zwecke einen Entropiewert welcher grob gesagt den Informationsgehalt pro Pixel aussagt.

    Zum Einlesen wäre das ein Ansatz: Einführung in die medizinische Bildverarbeitung

    Bildkodierungsmethode (Kodiert ein Einzelbild mit möglichst geringer Datenmenge)

    So wie ich das sehe stellst du momentan noch das Einzelbild als homogene Fläche mit dem Mittelwert des Ausgangsbildes dar?

    Um mit wenig Infos näher an das Ausgangsbild zu kommen wäre eine Parametrisierung in eine 2D-Funktion sinnvoll.

    Z.B. eine 2D-Fourierreihe. Für das Ausgangsbild müssten hierzu über eine Fourieranalyse (für DFT gibt es bereits zig Libraries) die wesentlichen (die Anzahl bestimmt die Qualität) Parameter der entsprechenden Fourierreihe abgeleitet werden und für den Bildbereich nur diese Parameter gespeichert werden. Bei der Rekonstruktion des Bildes kann über die Fourierreihe mit diesen Parametern der Bildbereich wieder hergestellt werden.

    Einmal editiert, zuletzt von AspirinJunkie (6. Oktober 2017 um 09:32)

  • Bildname : Mona512.png

    Auflösung Originalbild : 203 x 203 DPI , Komprimierung = JPEG, quality: 84, subsampling ON (2x2)

    Hier erhalte ich mit dem Anzeigeprogramm Irfanview folgende Meldung : "Mona512.png ist eine JPG Datei mit falscher Erweiterung"

    Jop, hier habe ich scheinbar Mist gebaut, was das Dateiformat angeht. Hatte mich schon gewundert, warum die 512px breite .png kleiner ist als die 256px Version :D

    Den Test mit einer 5 MB großen .jpg-Datei habe ich nach ca. 25 min. abgebrochen -> kein Fehler, war wohl noch am Rechnen ;)

    Das ist normal. Das Programm braucht pro Pixel annähernd konstante Zeit (pro "Ebene", aber das vernachlässigen wir mal). Nach einer kurzen Überschlagsrechnung ergibt das für ein 8 Megapixelbild ca. 39 Minuten (Plusminus).

    Anregung :

    Könntest Du in den Dateinamen der .zip und der imagesplit.au3 eine Versionsnummer integrieren (z.B. imagesplit_1_0_0.au3).

    Ich vermute, da werden noch diverse neuere Programmstände kommen, und so kann man sie leichter unterscheiden.

    Wird beim nächsten Upload erledigt, Chef :)

    AspirinJunkie Die Standardabweichung habe ich gewählt, da mir keine gute Methode eingefallen ist den Informationsgehalt wie z.B. bei einem Zeichenstrom zu berechnen. Dort lässt sich ja einfach jedem Zeichen eine Häufigkeit zuordnen und mit dem Wissen über die Anzahl verschiedener Zeichen und der Nachrichtenlänge lässt sich ein Entropiewert ausrechnen (dafür habe ich glaube ich schon ein Skript hier im Forum gepostet... lang ists her). Aber wenn man z.B. 4x4px hat und jeder Pixel eine andere- aber ähnliche Farbe hat, hätte man für jeden Px die Häufigkeit 1/16 und damit überall den gleichen Informationsgehalt, egal welche Farben die 16 Pixel tatsächlich haben. Man könnte das ggf umgehen indem man auf eine niedrigere Bitrate wechselt (z.B. wenn man nicht mehr 8Bit/Farbe sondern 4Bit/Farbe nutzt, dann sind "ähnliche" Pixel "gleich" und die oben genannte Entropiemethode greift wieder), aber ob das eine gute Idee ist weiß ich nicht :D Zumindest habe ich jetzt erstmal etwas Lektüre, danke dafür :)

    Der Output mit gleichfarbigen Flächen ist nur ein Beispiel (damit man sieht wie das Bild mit einfarbigen Flächen aussehen würde^^). Einen tatsächlichen Algorithmus zur Kodierung der Einzelbilder habe ich noch nicht, der kommt dann irgendwann später. Wie genau das von statten gehen soll steht auch noch in den Sternen, über Fourierreihen habe ich nachgedacht, aber genau das gleiche Prinzip benutzt jpg, villeicht gibt es ja noch etwas anderes :)

    Edit: Das mit der Überlagerung von Gaußfunktionen am Ende der pdf gefällt mir. Damit könnte man in 2D ebenfalls einen Verlauf für die R G B Werte basteln der das Original(teil)bild wiederspiegelt.

    lg

    M