Question

J'ai une série d'images. Chacun est généralement (mais pas toujours) semblable à la précédente, avec 3 ou 4 petites régions rectangulaires mis à jour. Je dois enregistrer ces changements avec un minimum d'espace disque.

Les images source ne sont pas compressés, mais je voudrais les deltas à compresser.

Je dois être en mesure de recréer les images exactement comme entrée (donc un codec vidéo est lossy ne convient pas.)

Je pense à quelque chose le long des lignes de:

  • Composite la nouvelle image avec un négatif de l'ancienne image
  • Enregistrez l'image composited dans un format commun qui peut compresser en utilisant RLE (probablement PNG).
  • recréer la deuxième image par l'image précédente de composition avec le delta.

Bien que les images ont un canal alpha, je peux l'ignorer pour l'application de cette fonction.

Y at-il un outil facile à implémenter l'algorithme ou d'une bibliothèque Java libre avec cette capacité?

Était-ce utile?

La solution

Expérimenter un peu avec des compresseurs sans perte existants - PNG, JPEG sans perte de, etc - sur une image constituée par les changements que (vous pouvez utiliser fond transparent pour PNG, ou d'une couleur uniforme). Ces algorithmes sont très efficaces en matière de compression d'une image qui est la plupart du temps constant, vous ne serez pas en mesure de les battre si vous n'êtes pas un expert.

Autres conseils

Si le nombre de rectangles est généralement faible, et les rectangles eux-mêmes sont petits, vous pouvez fait des lignes et des colonnes avec des différences, l'utiliser pour trouver des rectangles qui pourraient être différents ...

Imaginez les images avec les valeurs de pixel suivantes ...

0 0 0 1 1 1 2 2 3 3
0 0 1 1 0 0 1 1 2 2
0 0 1 1 0 0 0 1 1 2
0 0 1 1 0 0 0 1 1 2
0 1 1 0 0 3 0 0 1 1
0 1 1 0 0 3 0 0 1 1
0 0 1 1 0 0 0 1 1 2
0 0 1 1 0 0 0 1 1 2
0 0 0 1 1 1 1 1 0 2
2 2 2 2 2 1 1 2 2 2

... et ...

0 0 0 1 1 1 2 2 3 3
0 1 1 1 0 0 1 1 2 2
0 1 2 4 0 0 0 1 1 2
0 1 2 3 0 0 0 1 1 2
0 1 1 0 0 3 0 0 1 1
0 1 1 0 0 3 0 0 1 1
0 0 1 1 0 3 3 2 1 2
0 0 1 1 0 3 3 2 1 2
0 0 0 1 1 2 2 2 0 2
2 2 2 2 2 1 1 2 2 2

D'abord, vous viendriez avec un masque dont les pixels des lignes, des lignes et des colonnes présentaient des différences ...

    0 1 1 1 0 1 1 1 0 0

0   0 0 0 0 0 0 0 0 0 0
1   0 1 0 0 0 0 0 0 0 0
1   0 1 1 1 0 0 0 0 0 0
1   0 1 1 1 0 0 0 0 0 0
0   0 0 0 0 0 0 0 0 0 0
0   0 0 0 0 0 0 0 0 0 0
1   0 0 0 0 0 1 1 1 0 0
1   0 0 0 0 0 1 1 1 0 0
1   0 0 0 0 0 1 1 1 0 0
0   0 0 0 0 0 0 0 0 0 0

Les données de lignes et de colonnes nous donnent des indications à l'endroit où il pourrait y avoir des rectangles ...

    0 1 1 1 0 1 1 1 0 0

0   0 0 0 0 0 0 0 0 0 0
1   0 ? ? ? 0 ? ? ? 0 0
1   0 ? ? ? 0 ? ? ? 0 0
1   0 ? ? ? 0 ? ? ? 0 0
0   0 0 0 0 0 0 0 0 0 0
0   0 0 0 0 0 0 0 0 0 0
1   0 ? ? ? 0 ? ? ? 0 0
1   0 ? ? ? 0 ? ? ? 0 0
1   0 ? ? ? 0 ? ? ? 0 0
0   0 0 0 0 0 0 0 0 0 0

itérer sur chacun des rectangles possibles et de décider s'il y a des changements ou non et de les encoder. Vous pouvez ajouter d'autres axes de hachage au lieu de lignes et de colonnes, si vous avez besoin ... comme vous pouvez diviser l'image en régions et hachage si une région a des changements, utilisez le hachage pour décider si oui ou non une région doit coder. Que vous pourriez faire un nombre arbitraire de fois et ont un algorithme assez rapide qui produit également de petits fichiers.

Quel que soit le cas, je pense que le mieux est de construire une carte de ce qui a été changé et utiliser des agrégats qui vous indiquent si les blocs ont été modifiés pour guider votre prise de décision. Si vous collectez assez de ceux-ci, vous pouvez même créer un couple différents algorithmes qui font de bons emplois dans des circonstances différentes, puis les mettre dans une chaîne de responsabilité qui décide quel algorithme à utiliser en fonction des caractéristiques de la carte et vous HASHES édifiés.

Si les changements vont rester rectangulaires que vous pouvez enregistrer ces sections séparément, à savoir l'image originale ainsi que les changements et leurs positions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top