8
votes

Comment produire une vignette unitaire pour un milliard d'images PNG?

Dans l'application, il y a environ 1 milliard d'images PNG (taille 1024 * 1024 et environ 1 Mo chacune), il a besoin de combiner les 1 milliards d'images à une immense image, puis produit une taille 1024 * 1024 vignette unitaire pour cela. Ou peut-être que nous n'avons-nous pas besoin de combiner vraiment les images à une énorme, mais faites simplement un algorithme magique pour produire la vignette unitaire dans la mémoire de l'ordinateur? Pendant ce temps, ce processus doit être fait aussi vite que possible, mieux en quelques secondes, ou du moins dans quelques minutes. Est-ce que quelqu'un a une idée?

 Entrez la description de l'image ici


8 commentaires

US milliards ( 10 ** 9 ) ou un milliard de l'UE ( 10 ** 12 )?


Un moyen d'un milliard de, une quantité énorme.


Qu'entendez-vous par thumbnail unitaire et dans quel but?


Comme l'image que j'ai attachée dans le poteau, les images PNG doivent être tranchées à une image immense, puis je veux la vignette de l'immense image.


C'est évident, mais vous n'avez pas défini ce que vous entendez par la vignette; Il y a une différence entre 16x16 Image vs 99999999x999999999 Image. Vous n'avez pas non plus défini ce que vous entendez par rapides (millisecondes vs secondes vs minutes vs heures). Les limites de votre question ne sont pas claires et peuvent avoir un impact énorme sur la façon de faire des choses.


@ user694733, merci de vous rappeler, j'ai ajouté les informations manquantes, la vignette doit être la taille 1024 * 1024 et le temps de processus doit être inférieur à quelques minutes.


Notez que la taille de votre vignette, 1024 * 1024, est à peu près un million pixels. Utilisation d'images milliards pour le produire, signifie que chaque image d'origine contribuera à environ 1 / 1000e pixel dans la vignette ... La vignette est peu susceptible de visualiser toute information significative. Êtes-vous sûr que c'est ce que vous voulez?


@haraldk, votre opinion est rationnelle, si je veux une miniature taille 1024000 * 1024000, toute bonne idée de le produire?


3 Réponses :


3
votes

ImageMagick peut faire cela:

montage -tile * .png tiled.png

Si vous ne voulez pas utiliser un assistant externe pour une raison quelconque, vous pouvez toujours utiliser les sources.


2 commentaires

Il est très lent pour une grande quantité d'images dans mes tests, toute suggestion?


Donc, sur un groupe de machines, l'utilisation de montage (avec -Resize) permettrait de regrouper des images. Donc, pour atteindre vos objectifs, vous créeriez d'abord un ensemble d'emplois NXN et d'exécuter ceux-ci, puis sur les montages générés, répétez jusqu'à ce que vous soyez laissé avec un seul montage.



9
votes

L'idée de charger un milliard d'images en un seul montage code> est ridicule. Votre question n'est pas claire, mais votre approche devrait être de déterminer le nombre de pixels que chaque image d'origine s'achèvera dans votre image finale, puis extraire le nombre nécessaire de pixels de chaque image en parallèle. Puis assemblez ces pixels dans une image finale.

Donc, si chaque image sera représentée par un pixel dans votre image finale, vous devez obtenir la moyenne de chaque image que vous pouvez faire comme ceci: p>

find . -name \*.png -print0 | parallel -0 convert {} -format "%[fx:mean.r],%[fx:mean.g],%[fx:mean.b]:%f\n" info:


4 commentaires

Si les images de tuiles seront téléchargées de différents clients, c'est une bonne idée de produire le pixel représenté sur le client avant de télécharger, puis composez les pixels à l'image sur le serveur? Est-ce que cette façon sera très rapide?


La réponse dépend de votre environnement qui, malheureusement, je ne peux pas comprendre avec la description actuelle. S'il y a 1 000 000 000 clients vous envoyant une image, il serait logique que chacun vous envoie le minimum nécessaire. S'il n'y a que 1024 clients fournissant chacun 1 000 000 images, il serait logique que chaque client puisse effectuer un bloc complet pour vous, mais vous ne pouvez pas le faire si chaque client n'envoie qu'une seule photo. En général, plus vous pouvez utiliser des machines sur les différentes parties, mieux c'est.


Puis-je vous suggérer respectueusement de modifier votre question et de l'améliorer afin que les gens ne soient pas à deviner et à perdre leur temps à couvrir les cas qui ne sont peut-être pas pertinents ou ne pas être des réponses basées sur de fausses hypothèses découlant d'une mauvaise description ...


Oui, merci, je vais améliorer la description aussi clair que possible.



3
votes

algorithme randomisé tel que l'échantillonnage aléatoire peut être réalisable.

Considérant que l'image combinée est si importante, tout algorithme linéaire peut échouer, sans parler de la méthode de complexité plus élevée.

Par calculs, nous pouvons inférer chaque pixel de vignette dépend de 1000 image. Donc, un seul résidu d'échantillonnage n'affecte pas beaucoup le résultat.

La description d'algorithme peut être suivie:

Pour chaque coordonnée de pixels de vignette, choisissez N Images aléatoires qui sur l'emplacement correspondant et chaque image échantillonnant des pixels, puis calculez la valeur moyenne. Faites la même chose pour d'autres pixels miniatures.

Toutefois, si vos images sont combinées de manière aléatoire, le résultat est généralement une image en niveaux de gris valorisée de 0,5. Parce que par le théorème de la limite centrale, la variance du pixel d'image miniature a tendance à être zéro. Donc, vous vous assurez que la vignette combinée est structurée elle-même.

PS: Utiliser OpenCV serait un bon choix


0 commentaires