2014-05-03 3 views
4

J'essaie de gérer un énorme tableau numpy que je finis par écrire dans une image JPEG en utilisant cv2.imwrite(numpy.array). Malheureusement, ce que je suis en train de travailler ne rentre pas dans ma RAM même si l'image JPG finale ne devrait pas dépasser environ 200 Mo.Comment gérer de grandes images en Python en utilisant OpenCV?

Comment puis-je gérer de telles charges sans surcharger ma RAM?

Existe-t-il d'autres façons d'écrire une image sans stocker tout le tableau dans ma mémoire vive en même temps? Il est possible pour moi de charger de petits morceaux du tableau à la fois, mais je ne sais pas quel module/fonction utiliser pour écrire sur une image sans stocker tout le contenu de ma RAM à la fois.

En ce moment, j'ai sauvegardé l'image entière dans 4 images plus petites (quarts) parce que c'est le meilleur que je pouvais faire avec ma RAM limitée. Mais je veux toujours être capable de les assembler en une image complète. L'image cible est une image 26112 x 20480 à 3 canaux.

Répondre

1

Vous pouvez utiliser une matrice clairsemée pour manipuler des images volumineuses. Une bibliothèque qui pourrait fonctionner pour vous est Eigen. Here is a tutorial sur l'utilisation de matrices creuses avec cette bibliothèque. OpenCV prend également en charge les matrices creuses.

+0

Mais l'image n'est pas une matrice clairsemée. Sauf si je me trompe, ne sont pas des matrices éparses celles avec beaucoup de zéros? –

+0

La matrice clairsemée ne contient que des valeurs nulles et lorsque vous la convertissez en matrice dense, elle vous renvoie la matrice avec vos données d'origine et quand vous enregistrez votre image en utilisant une matrice clairsemée, elle écrit les données originales de votre image. – user3018945

2

Si l'image est de taille 26112 x 20480 avec trois canaux, à un octet par canal, les données non compressées prennent 3 x 26112 x 20480 octets, ce qui correspond à environ 1,5 gigaoctets. Le fichier JPEG peut être beaucoup plus petit car il utilise une compression avec perte, mais pas la représentation OpenCV de l'image.

Certaines opérations (telles que le recadrage sur les limites de bloc) sont possibles sur la représentation compressée comme en témoigne Jpegtran mais pour la plupart des choses que vous feriez dans OpenCV, vous devrez décompresser les données. Si votre algorithme s'avère être quelque chose qui peut être écrit directement en termes de coefficients DCT de blocs 8x8, vous n'aurez pas à décompresser, mais OpenCV ne vous aidera pas là-bas.

Je ne sais pas si c'est possible avec OpenCV, mais numpy prend en charge memory-mapped I/O des données de tableau brutes. Lorsque vous lisez une page de données qui n'est pas en mémoire, le système d'exploitation la lit à partir du fichier mappé et, s'il n'y a plus de mémoire, expulse certaines pages. Cela dépendra de vos modèles d'accès aux données si cela va être performant. En principe, vous devriez simplement appeler mmap sur un fichier dans lequel vous avez décompressé toutes les données d'image dans la configuration de mémoire correcte et wrap the pointer in an OpenCV array, mais je n'ai pas essayé cela moi-même.

Questions connexes