12
votes

Compression avec meilleur rapport en python?

Quelle méthode de compression en Python a le meilleur rapport de compression?

est le couramment utilisé zlib.compress () le meilleur ou y a-t-il de meilleures options? J'ai besoin d'obtenir le meilleur ratio de compression possible.

Je comprends des cordes et je les envoie sur UDP. Une corde typique que je compresse a environ 1 700 000 octets.


0 commentaires

3 Réponses :


9
votes

Je suis sûr qu'il pourrait y avoir des formats plus obscurs avec une meilleure compression, mais Lzma est le meilleur, de ceux qui sont bien soutenus. Il y a des liaisons python ici .

Modifier

Ne choisissez pas de format sans test, certains algorithmes fonctionnent mieux en fonction du jeu de données.


7 commentaires

Mon ensemble de données est une longue chaîne représentant une image 640x480.


Si vous utilisiez déjà un format d'image avec un bon algorithme de compression, est-il nécessaire de compresser le tout à nouveau?


@joni L'image n'était pas vraiment si bien comprimée. zlib.compress () la diminuait à la CCA 30% de la taille initiale. Mais je cherche une compression encore plus drastique.


@Richard Knop, dans ce cas, vous pourriez obtenir une meilleure compression en convertissant les images en un format d'image compressé. S'il doit être une compression sans perte, j'essaierais PNG. PNG utilise la compression ZLIB, qui est moins efficace que la LZMA, mais peut-être du pré-filtrage qui entraînera probablement un meilleur global. En théorie, vous pourriez remplacer la compression de zlib en PNG avec LZMA, mais ce n'est pas quelque chose que vous pouvez faire avec désinvolture en python.


L'utilisation d'un format d'image comprimé comme PNG était ce que je voulais dire, à.


@Mikerobi: Pourquoi devrait-il être une compression sans perte? La compression de permission donnera généralement de meilleurs résultats si elle est compatible avec le problème.


@kriss, c'est pourquoi j'ai qualifié mon commentaire avec "si cela doit être sans perte", je devais simplement deviner basé sur le point qui n'est pas ce qu'il voulait.



5
votes

Si vous êtes prêt à échanger des performances pour la compression de getter, la bibliothèque BZ2 donne généralement de meilleurs résultats que la bibliothèque GZ (ZLIB).

Il existe d'autres bibliothèques de compression telles que XZ (LZMA2) qui pourraient donner des résultats encore meilleurs, mais ils ne semblent pas être dans la distribution de base de Python.

Python Doc pour la classe BZ2

EDIT: Selon le type d'image, vous ne pouvez pas obtenir beaucoup de compression supplémentaire. De nombreux formats d'image sont auparavant comprimés à moins que ce ne soit brut, BMP ou TIFF non compressé. Les tests entre divers types de compression seraient fortement recommandés.

Edit2: Si vous décidez de faire une compression d'image. Image Magick prend en charge les liaisons Python et de nombreux types de conversion d'image.

Magick

formats d'image pris en charge


9 commentaires

C'est une image brute. Non comprimé. zlib.compress () rétrécissez-le à 30% de la taille.


Comme il s'agit d'une image brute, la liaison LZMA devrait faire un peu mieux que la bibliothèque BZ2. Comme suggéré ci-dessus, vous devriez pouvoir utiliser une compression d'image sans perte avec un résultat bon / meilleur.


@CTranger: Vous voulez dire Pertey pas sans perte ? N'est-ce pas?


@kriss: Cela dépend de l'algorithme de compression d'image. Je pense que PNG ferait toujours mieux qu'une compression de bloc sur les données brutes.


@CTranger: Tout système de compression qui serait au courant des pixels et que la taille de l'image est probablement meilleur que l'algorithme de compression à usage général. C'est vrai pour PNG. Mais vous pouvez obtenir des résultats encore meilleurs si une perte de données (même invisible à l'œil, comme JPEG de haute qualité) peut être accordée.


Je suis totalement d'accord avec cette déclaration. Il pourrait y avoir une certaine exigence sur les données qui empêchent toute sorte de perte puisqu'elles examinaient à l'origine la compression de bloc RAW +. S'il n'y a aucune obligation, un léger algorithme de perte serait le meilleur choix.


@CTranger: J'ai vérifié la méthode de compression utilisée par PNG. En fait, il utilise dégonfler (même algorithme que ZLIB). Cela signifie qu'il ne faut probablement pas prendre en compte la taille de l'image, mais une taille de pixel (chaque "caractère" étant un pixel).


@kriss: C'est vrai. La grande différence serait que PNG utilise des pré-filtres conscients d'image pour optimiser les données avant la phase de compression de bloc. Selon les détails de l'image, cela peut être beaucoup mieux que de dégonfler ou probablement à peu près la même chose.


Notez que les versions récentes de Python3 semblent avoir lzma2 support ( Docs .pytHon.org / 3 / bibliothèque / lzma.html )



3
votes

Le meilleur algorithme de compression dépend définitivement du type de données que vous abordez. Sauf si vous travaillez avec une liste de numéros aléatoires stockés sous forme de chaîne (auquel cas aucun aucun algorithme de compression ne fonctionnera) en sachant que le type de données permet généralement d'appliquer beaucoup de meilleurs algorithmes que les usages généraux (voir Autres réponses pour les bons algorithmes de compression générale prêts à utiliser).

Si vous avez affaire à des images, vous devez définitivement choisir un format de compression à perte de temps (c.-à-d .: Pixel au courant) de préférence à toute perte sans perte. Cela vous donnera de bien meilleurs résultats. Recompresser avec un format sans perte sur une perte de temps est une perte de temps.

Je rechercherais via PIL pour voir ce que je peux utiliser. Quelque chose comme la conversion de l'image en JPEG avec un ratio de compression compatible avec la qualité recherchée avant l'envoi devrait être très efficace.

Vous devez également être très prudent si vous utilisez UDP, il peut perdre des paquets et la plupart des formats de compression sont très sensibles aux parties manquantes du fichier. D'ACCORD. Qui peut être géré au niveau de l'application.


4 commentaires

JPEG est un bon format d'image sans perte, PNG est un bon format d'image sans perte. Je ne dirais pas que la perte est toujours préférée, cela dépend vraiment des données. La perte est préférée pour des images bruyantes; Des photos, des analyses, etc. sans perte fonctionne bien pour les graphiques, la ligne d'art, etc.


@Adw: Je suis d'accord avec vous PNG et JPEG sont tous deux de bons formats, mais si vous prenez en compte le ratio de compression, JPEG est beaucoup mieux. J'ai vérifié la compression PNG et il suffit d'utiliser déflate (même algorithme que celui utilisé dans Zlib).


@Richardknop: Le format d'image réel ne doit pas changer beaucoup d'architecture du programme. Le meilleur format peut dépend du type d'image que vous gérez, du nombre de couleurs, de la perte de qualité acceptable ou non, etc. Je suppose que JPEG est probablement un bon candidat (c'est pas Le meilleur comme indiqué que JPEG2000 ou certains algorithmes fractales donnent une meilleure compression, mais c'est très bien soutenu et susceptible de donner de bons résultats).


Comme je l'ai dit, cela dépend des données. Pour certaines sortes de données PNG, c'est beaucoup mieux (à la fois dans la qualité visuelle et le ratio de compression). PNG n'utilise pas uniquement de déflate, il utilise des filtres de prédiction à (souvent grandement) améliorer le ratio de compression (par exemple prédicteur de Paeth).