In der Anwendung gibt es ungefähr 1 Milliarde png Bilder (Größe 1024 * 1024 und ungefähr 1MB), es muss die 1 Milliarde Bilder zu einem riesigen Bild kombinieren und erzeugt dann eine Größe von 1024 * 1024 einheitliches Thumbnail dafür. Oder müssen wir die Bilder nicht wirklich zu einem großen zusammenfügen, sondern nur einen magischen Algorithmus, um das einheitliche Thumbnail im Computerspeicher zu erzeugen? Inzwischen muss dieser Prozess so schnell wie möglich, besser in Sekunden oder zumindest in wenigen Minuten erledigt werden. Hat jemand eine Idee?
Die Idee, Milliarden Bilder in einen einzigen montage
Prozess zu laden, ist lächerlich. Ihre Frage ist unklar, aber Ihr Ansatz sollte sein, zu bestimmen, wie viele Pixel jedes Originalbild in Ihrem endgültigen Bild betragen wird, und dann die erforderliche Anzahl von Pixeln aus jedem Bild parallel extrahieren. Dann fügen Sie diese Pixel zu einem endgültigen Bild zusammen.
Wenn also jedes Bild in Ihrem endgültigen Bild durch ein Pixel dargestellt wird, müssen Sie den Mittelwert jedes Bildes ermitteln, das Sie so machen können:
%Vor%Beispielausgabe
%Vor%Sie können das dann sehr schnell parallel mit GNU Parallel machen, indem Sie etwas wie
verwenden %Vor%Dann können Sie ein endgültiges Bild machen und die einzelnen Pixel einfügen.
Das Scannen von sogar 1.000.000 PNG-Dateien wird wahrscheinlich viele Stunden dauern ...
Sie sagen nicht, wie groß Ihre Bilder sind, aber wenn sie in der Größenordnung von 1MB liegen und Sie 1.000.000.000 haben, dann müssen Sie ein Petabyte an I / O machen, um sie zu lesen, also sogar mit einem 500MB / s ultra-schnelle SSD, Sie werden dort 23 Tage sein.
Randomisierte Algorithmen wie Zufallsstichproben sind möglich.
Wenn man bedenkt, dass das kombinierte Bild so groß ist, kann jeder lineare Algorithmus versagen, ganz zu schweigen von der Methode mit höherer Komplexität.
Durch Berechnungen können wir jedes einzelne Thumbnail-Pixel von 1000 Bildern ableiten. Ein einzelnes Sampling-Residuum beeinflusst das Ergebnis nicht sehr.
Die Beschreibung des Algorithmus kann wie folgt lauten:
Wählen Sie für jede Miniaturpixel-Koordinate zufällig N Bilder aus, die an der entsprechenden Stelle liegen, und jedes Bild M-Pixel abtastet und dann ihren Durchschnittswert berechnet. Machen Sie dasselbe für andere Thumbnail-Pixel.
Wenn Ihre Bilder jedoch zufällig kombiniert werden, ist das Ergebnis in der Regel ein 0,5-wertiges Graustufenbild. Weil durch den zentralen Grenzwertsatz die Varianz des Thumbnail-Bildpixels dazu neigt, Null zu sein. Sie müssen also sicherstellen, dass das kombinierte Thumbnail selbst strukturiert ist.
PS: mit OpenCV wäre eine gute Wahl
Tags und Links image image-processing png imagemagick graphic