Wie erzeugt man ein einheitliches Thumbnail für eine Milliarde PNG-Bilder?

8

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?

    
Suge 14.02.2017, 07:46
quelle

3 Antworten

9

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.

    
Mark Setchell 14.02.2017 10:17
quelle
3

ImageMagick kann das tun:

montage -tile *.png tiled.png

Wenn Sie aus irgendeinem Grund keinen externen Helfer verwenden möchten, können Sie immer noch die Quellen verwenden.

    
mfro 14.02.2017 07:51
quelle
3

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

    
lianera 14.02.2017 11:55
quelle