Сжатие больших массивов данных в виде файлов PNG - PullRequest
1 голос
/ 13 сентября 2011

В качестве выходных файлов измерения я получаю большие файлы ASCII, содержащие таблицу чисел с плавающей запятой 1000x1000 (~ 15 МБ).Поскольку они нецелесообразны в больших количествах (т.е. еще 1000 измерений на серию), я хотел бы эффективно сжать их.Используя структуру данных (в основном 1-мегапиксельная карта -> рисунок), я попытался использовать функцию Pylabs imsave для генерации PNG-файлов из необработанных данных, которая прекрасно работала и давала 200 КБ (!!!!!) * .png.

Чтобы проанализировать данные на более позднем этапе, мне, очевидно, необходимо выполнить обратную обработку PNG и получить обратно ту же исходную таблицу.Однако предполагаемая функция imread дает 4 кортежа, которые я не могу понять.Кто-нибудь имеет какой-либо опыт работы с таким процессом или лучше знает, как решить проблему сжатия (простое сжатие недостаточно даже для удаленного сжатия).

import numpy
import Image
import matplotlib
import pylab

data=numpy.genfromtxt('raw data.txt',autostrip=True, case_sensitive=True)
pylab.imsave('convert.png',data)

out=pylab.imread('convert.png')
numpy.savetxt('converted.txt', out[0], fmt='%1.4e')

Ответы [ 2 ]

3 голосов
/ 13 сентября 2011

Тот факт, что png настолько мал, что он использует библиотеку zlib. Я думаю, что вы предпочли бы использовать эту библиотеку вместо оболочки png, это будет менее запутанным.

См. http://zlib.net.

Если вы все еще хотите использовать библиотеку png, тот факт, что у вас 4 кортежа, объясняется тем, что изображения png обычно имеют альфа-канал, поэтому форматом является RGBA, и вам нужно использовать все 4 для восстановления данных.

0 голосов
/ 13 сентября 2011

imsave сохраняет ваш массив в виде файла изображения, но можете ли вы быть уверены, что он не уменьшает изображение?Обычно изображение PNG составляет 8 бит на канал.Возможно, что pylab перечитал ваши данные, жертвуя точностью.

Вы делали различие между raw_data.txt и convert.txt?Можно использовать модуль gzip или модуль bz2.См. Например bz2 .

...