Каков наилучший способ сохранения метаданных изображения вместе с 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.)

вы можете попробовать установить теги в tag свойство изображения TIFF. Это