使用PIL TiffTag从.tif图像元数据中提取比例尺

时间:2019-02-05 00:10:25

标签: python metadata python-imaging-library tiff

我是Python的新手,希望从电子显微镜(.tif)图像中提取比例信息。

当我在记事本中打开文件并滚动到底部时,我看到一个标题“ [Scan]”及其下的一个项目“ 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 :(得分:1)

您的文件可能是FEI SEM TIFF,它在TIFF标签34682中包含类似INI的元数据。

尝试使用tifffile

import tifffile
with tifffile.TiffFile('FEI_SEM.tif') as tif:
    print(tif.fei_metadata['Scan']['PixelWidth'])

答案 1 :(得分:0)

使用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>]而不填充字典。