Image rendern

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Julian_Str
Beiträge: 2
Registriert: Di 12. Dez 2017, 21:55

Image rendern

Beitrag von Julian_Str »

Hallo ich bin ganz neu hier und wollte ein altes Projekt wiederbeleben.

Ich habe vor längerer Zeit mal mit einem Freund in C# ein Programm geschrieben das bei einer gewählten Höhe und Breite (in pixeln)
jede mögliche RGB Kombination auf dem Bildschirm nacheinander ausgibt.
Ich bin mir dessen bewusst, das man die gigantische Anzahl der Bilder nirgends speichern kann :D
Das eigentliche Ziel war es jedoch hinter her durch eine AI die Bilder auf "Sinnhaftigkeit" zu untersuchen
(also ob es sich bei der Ausgabe um ein echtes Bild von Natur/etc. handelt und nicht bloß eine Pixelsuppe ist), und diese dann zu speichern.
Also es ist bei mir sehr lange her und mein Freund war der "Programmierer" ,
mit anderen Worten könnte mir jemand als kompletter Neuling mit Lazarus bei der erneuten Umsetzung helfen ?
Der Algorithmus von uns sah vor jedes einzelne Pixel zu manipulieren was natürlich ewig lange dauert um auf brauchbare Ergebnisse zu kommen.
Mir würde eine Annäherung reichen die am besten effizienter funktioniert :D

mit freundlichen Grüßen

Julian

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Image rendern

Beitrag von Warf »

Ich will jetzt kein Spielverderber sein, aber rechnen wir das ganze doch mal durch

Bei 32x32 Pixel (typisches Icon) mit 24 Bit Farben sind 2^24^1024 Kombinationen, sagen wir mal du würdest 100 Bilder pro Sekunde schaffen, dan bräuchtest du 10^10^142814921285030 Stunden um alle Kombinationen durchzugehen
Als kleine Hilfe 10^10 sind 10 milliarden. Gesamt ist viel länger als die lebenszeit des gesamten Universums

Es gibt da theoretisch deutlich bessere Methoden am einfachsten z.b. Fuzzing also zufälliges statt systematischem generieren. Denn wenn x kein Bild ist wird es mit einem geänderten Pixel wahrscheinlich auch kei Bild sein

Julian_Str
Beiträge: 2
Registriert: Di 12. Dez 2017, 21:55

Re: Image rendern

Beitrag von Julian_Str »

Warf hat geschrieben:Ich will jetzt kein Spielverderber sein, aber rechnen wir das ganze doch mal durch

Bei 32x32 Pixel (typisches Icon) mit 24 Bit Farben sind 2^24^1024 Kombinationen, sagen wir mal du würdest 100 Bilder pro Sekunde schaffen, dan bräuchtest du 10^10^142814921285030 Stunden um alle Kombinationen durchzugehen
Als kleine Hilfe 10^10 sind 10 milliarden. Gesamt ist viel länger als die lebenszeit des gesamten Universums

Es gibt da theoretisch deutlich bessere Methoden am einfachsten z.b. Fuzzing also zufälliges statt systematischem generieren. Denn wenn x kein Bild ist wird es mit einem geänderten Pixel wahrscheinlich auch kei Bild sein


Ja das stimmt die Mathematik dahinter sind wir damals auch durchgegangen :D
Es geht mir prinzipiell auch nur um die programmiertechnische Umsetzung ohne jeglichen realen anwendbaren Sinn :D
Aber das mit dem zufälligen generieren hört sich interessant an :) könntest du mir Noob vielleicht mal erklären wie das gemeint ist ? :D

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Image rendern

Beitrag von Warf »

Das programmieren ist herzlichst einfach:

Code: Alles auswählen

type
  PRGBRec = ^TRGBReg;
  TRGBReg = packed record
    B, G, R: byte;
  end;
var
  line: PRGBRec;
  b: TBitmap;
  x, y: integer;
begin
// Bitmap erstellen und konfigurieren
  b := TBitmap.Create;
  try
    b.SetSize(32, 32);
    b.PixelFormat := pf24bit;
// Bitmap zeichnen
    b.BeginUpdate;
    try
// Jede Zeile
      for y := 0 to b.Height - 1 do
      begin
// Zeile von der Bitmap holen
        line := b.ScanLine[y];
// jeder Pixel in der Zeile
        for x := 0 to b.Width - 1 do
        begin
// Farbe zuweise (hier rot)
          line[x].R := 255;
          line[x].G := 0;
          line[x].B := 0;
        end;
      end;
    finally
// fertig mit bearbeiten
      b.EndUpdate;
    end;
// in datei speichern
    b.SaveToFile('Bitmap.bmp');
  finally
    b.Free; // Speicher freigeben
  end;


Mit dem Zufälligen generieren meine ich, sagen wir mal du hast ein Bild von einem Berg. Wenn du jetzt einen Pixel veränderst, z.B. komplett schwarz färbst der vorher blau war, ist es auf dem bild immernoch ein Berg. Wenn du jetzt also eine AI hast die Berge erkennen kann, wird diese bei einem Pixel unterschied wahrscheinlich immernoch es als berg erkennen.

Für jedes Motiv gibt es also so eine Art "Hülle" von Bildern die sich nicht stark genug unterscheiden um etwas anderes darzustellen, aber dennoch kleine Unterschiede haben. Andersrum, ein Pixelhaufen ohne bedeutung wird warscheinlich durch einen Pixel unterschied nicht zu einem Pixelhaufen mit bedeutung.
Wenn du jetzt Systematisch alle bilder generieren würdest, also immer das vorherige bild nehmen, einen Pixel ändern und neu versuchen, wirst du jedes Bild dieser Hülle abklappern. Um das zu vermeiden könntest du die Bilder komplett zufällig generieren. Somit sind bei jedem Durchlauf die Chancen ein neues Bild zu treffen genauso groß wie die chancen ein bereits schon bekanntes bild zu treffen (unter der sehr naiven annahme das die Hülle jedes bildes gleich groß wäre).

Dann kannst du sogar noch was machen. Wenn man sich reale Bilder ansieht stellt man schnell fest, dass meisten Pixel an Position x, y fast die selbe Farbe hat wie seine nachbarn. Ein Pixel der sich komplett von allen umgebenden Pixeln unterscheidet ist sehr selten und eher eine Störung als ein tatsächliches Bildfeature. Es muss allerdings trozdem noch harte Kanten geben, kanten sind aber meist auch zusammenhängend.

Wenn man das alles berücksichtigt kann man wahrscheinlich sogar einen recht effizienten allgorithmus schreiben der Pseudobilder generieren kann. Wenn man lustig ist kann man da theoretisch beliebig viel Zeit und motivation reinstecken.

Antworten