Извлечение шкалы масштаба из метаданных изображения .tif с использованием PIL TiffTags - PullRequest
0 голосов
/ 05 февраля 2019

Я новичок в Python и надеюсь извлечь информацию о масштабе из изображения электронной микроскопии (.tif).

Когда я открываю файл в Блокноте и прокручиваю вниз, я вижу заголовок «[Сканирование]» и элемент под ним «PixelWidth = 3.10059e-010».

Я хотел бы прочитать это значение в Python и использовать его в качестве калибровочного коэффициента для измерения физических расстояний в изображении.

Я нашел многообещающий подход с использованием PIL (https://stackoverflow.com/a/46910779/10244370), но столкнулся с ошибкой при выполнении рекомендуемого кода.

from PIL import Image
from PIL.TiffTags import TAGS

with Image.open(imagetoanalyze) as img:
    meta_dict = {TAGS[key] : img.tag[key] for key in img.tag.iterkeys()}

Я ожидал, что это создаст объект "meta_dict", содержащийтакие строки, как "PixelWidth" и плавающие как "3.10059e-010".

Вместо этого я вижу:

Traceback (most recent call last):

  File "<ipython-input-62-4ea0187b2b49>", line 2, in <module>
    meta_dict = {TAGS[key] : img.tag[key] for key in img.tag.iterkeys()}

  File "<ipython-input-62-4ea0187b2b49>", line 2, in <dictcomp>
    meta_dict = {TAGS[key] : img.tag[key] for key in img.tag.iterkeys()}

KeyError: 34682

Я явно что-то делаю не так. Любая помощь будет принята с благодарностью. Спасибовы!

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Похоже, ваш файл может быть FEI SEM TIFF, который содержит метаданные, подобные INI, в теге TIFF 34682.

Попробуйте использовать tifffile :

import tifffile
with tifffile.TiffFile('FEI_SEM.tif') as tif:
    print(tif.fei_metadata['Scan']['PixelWidth'])
0 голосов
/ 05 февраля 2019

Используя PIL, я думаю, что было бы понятнее использовать цикл for для настройки словаря, а затем вывести желаемый результат.

from PIL import Image
from PIL.TiffTags import TAGS


with Image.open(imagetoanalyze) as img:
    meta_dict = {}
    for key in img.tag:      # don't really need iterkeys in this context
        meta_dict[TAGS.get(key,'missing')] = img.tag[key]

# Now you can print your desired unit:

print meta_dict["PixelWidth"]

Если вам нужно только одно значение, выможно также найти номер для тега PixelWidth с помощью этого:

for k in img.tag:
     print k,TAGS.get(k,'missing')

А затем просто напечатайте img.tag[<thatnumber>] без заполнения словаря.

...