Каков наилучший способ сохранения метаданных изображения вместе с tif с Python?
в моей работе в качестве аспиранта я захватываю изображения микроскопа и использую python, чтобы сохранить их как raw tif. Я хотел бы добавить метаданные, такие как название микроскопа, который я использую, уровень увеличения и длина волны лазера изображения. Эти детали важны для того, как я обрабатываю изображения.
Я должен быть в состоянии сделать это с tif, верно? Так как у него есть заголовок?
я смог добавить информацию в изображение PIL:
im.info['microscope'] = 'george'
но когда я сохраняю и загружаю это изображение, информация, которую я добавил, исчезает.
Я открыт для всех предложений. Если у меня тоже есть, я просто сохраню отдельный .txt файл с метаданными, но было бы очень хорошо, чтобы он был встроен в изображение. Спасибо.
3 ответов
для внутреннего использования попробуйте сохранить метаданные как JSON в теге TIFF ImageDescription, например
from __future__ import print_function, unicode_literals
import json
import numpy
import tifffile # http://www.lfd.uci.edu/~gohlke/code/tifffile.py.html
data = numpy.arange(256).reshape((16, 16)).astype('u1')
metadata = dict(microscope='george', shape=data.shape, dtype=data.dtype.str)
print(data.shape, data.dtype, metadata['microscope'])
metadata = json.dumps(metadata)
tifffile.imsave('microscope.tif', data, description=metadata)
with tifffile.TiffFile('microscope.tif') as tif:
data = tif.asarray()
metadata = tif[0].image_description
metadata = json.loads(metadata.decode('utf-8'))
print(data.shape, data.dtype, metadata['microscope'])
обратите внимание, что JSON использует строки unicode.
чтобы быть совместимым с другим программным обеспечением микроскопии, подумайте о сохранении OME-TIFF файлы, которые хранят определенные метаданные как XML в теге ImageDescription.
я должен быть в состоянии сделать это с tif, не так ли? Так как у него есть заголовок?
нет.
но TIFF-это формат файла с тегами, серия кусков разных типов, поэтому заголовок здесь не важен. И вы всегда можете создать свой собственный частный кусок (любой ID > 32767) и сохранить что-нибудь ты хочешь туда.
проблема в том, что только ваш собственный код будет иметь представление о том, что вы там сохранили. Итак, что вы наверное хотите сохранить EXIF или XMP или какой-либо другой стандартизированный формат для расширения TIFF с метаданными. Но даже там EXIF или что бы вы ни выбрали, у вас не будет тега для "микроскопа", поэтому в конечном итоге вам придется хранить что-то вроде "microscope=george\nspam=eggs\n" в некотором строковом поле, а затем анализировать его обратно себе.
но реальная проблема в том, что PIL/Pillow не дает вам простой способ хранить EXIF или XMP или что-нибудь еще подобное.
во-первых,Image.info
не для произвольных дополнительных данных. В save time это обычно игнорируется.
если вы посмотрите на документы PIL для TIFF, вы увидите, что он считывает дополнительные данные в специальный атрибут, Image.tag
, и может сохранять данные путем передачи tiffinfo
аргумент сайта на Image.save
метод. Но эти дополнительные данные-это сопоставление идентификаторов тегов TIFF с двоичными кусками данных. Вы можете получить идентификаторы тегов Exif из недокументированного PIL.ExifTags.TAGS
dict (или, посмотрев их в интернете самостоятельно), но это столько поддержки, сколько PIL собирается дать вам.
кроме того, обратите внимание, что при обращении tag
и с помощью tiffinfo
в первую очередь требуется достаточно современная версия подушка; более старые версии и классический PIL не поддерживали его. (По иронии судьбы, они сделал есть частичная поддержка EXIF для JPG-файлов, которая никогда не была завершена и была удалена...) также, хотя это, похоже, не документировано, если вы построили подушку без libtiff
он, кажется, игнорирует tiffinfo
.
в конечном счете, то, что вы, вероятно, захотите сделать, это:
- выберите нужный формат метаданных.
- используйте другую библиотеку, чем PIL / Pillow для чтения и записи этих метаданных. (Например, вы можете использовать
GExiv2
илиpyexif
для EXIF.)