2010-05-06 3 views
1

Existe-t-il un exemple efficace, rapide et simple de compression différentielle d'image en noir et blanc? Ou encore mieux, certains simples (mais sans perte - images 1bpp déchiquetées ne semblent pas très convaincant lorsqu'il est compressé en utilisant la compression avec perte) technique de streaming qui pourrait accepter un certain nombre de cadres en entrée? J'ai un simple flux image noir et blanc (320x200), affichant quelque chose de similaire à un affichage LED, qui est mis à jour environ une fois par seconde en utilisant AJAX. Les images sont assez similaires la plupart du temps, donc si je les soustrais, le résultat se compresserait assez bien (même avec un simple RLE). Est-ce que quelque chose comme ça est disponible?Compression d'image différentielle bicolore simple

+0

Les images sont-elles simplement stockées sous la forme d'un bit par pixel? –

+0

C'est leur profondeur de bits, oui. Leur représentation réelle en mémoire peut être modifiée au besoin (à un moment donné, ils sont gérés avec des objets .NET Image avec une profondeur de 1bpp, puisque j'utilise .NET). Mais c'est un tas d'images, pas un flux vidéo. – Groo

+1

Je suis sûr que ce n'est pas la méthode la plus efficace, mais je considérerais faire 1 pixel par octet et XORing les deux images. Tous les bits dont la valeur a changé seront 1, la plupart des bits seront nuls. Ensuite, run-length code le tableau résultant. - Si vous déposez des cadres, cependant, cela se comportera mal. –

Répondre

2

Je ne connais aucune bibliothèque qui existe déjà et qui puisse faire ce que vous demandez, autre que de l'exécuter simplement via gzip ou un autre algorithme de compression sans perte. Cependant, puisque vous savez que les cadres sont fortement corrélés, vous pouvez XOR les cadres comme le compilateur remarquable suggéré, puis lancez gzip sur cela. S'il y a peu de changements entre les trames, le résultat du XOR devrait avoir beaucoup moins d'entropie que le frame original. Cela permettra à gzip ou à un autre algorithme de compression sans perte d'atteindre un taux de compression plus élevé.

Vous voudriez également envoyer une trame clé (non différentielle) de temps en temps pour que vous puissiez resynchroniser en cas d'erreurs.

Si vous souhaitez simplement en savoir plus sur la compression, vous pouvez essayer d'implémenter le RLE après avoir XORé les images. Découvrez le RLE au niveau du bit discuté here à mi-chemin de la page. Il devrait être assez facile à implémenter car il stocke juste dans chaque octet une longueur de 7 bits et une valeur d'un bit afin qu'il puisse atteindre un taux de compression dans le meilleur des cas de 128/8 = 16 s'il n'y a pas de changements entre les trames.

Une autre pensée est que s'il y a très peu de changements, vous pouvez simplement encoder les positions de bits qui basculent entre les trames. Vous pouvez adresser l'image 320x200 avec un entier de 16 bits. Par exemple, si seulement 100 pixels changent, vous pouvez simplement stocker 100 entiers de 16 bits représentant ces positions (1600 bits) où le RLE discuté ci-dessus prendrait 64000/16 = 4000 bits au minimum (ce serait probablement un peu plus élevé) . Vous pouvez réellement basculer entre cette méthode et RLE selon le contenu du cadre.

Si vous vouliez aller au-delà des méthodes simples, je suggèrerais d'utiliser des codes de longueur variable pour représenter les passages possibles pendant le codage en longueur de ligne. Vous pouvez ensuite attribuer des codes plus courts aux séries ayant la probabilité la plus élevée. Ce serait similaire au RLE utilisé en JPEG ou MPEG après que la partie avec perte de la compression soit effectuée (DCT et quantification).