【问题标题】:Extracting scale bar from .tif image metadata using PIL TiffTags使用 PIL TiffTags 从 .tif 图像元数据中提取比例尺
【发布时间】:2019-02-05 00:10:24
【问题描述】:

我是 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

显然我做错了什么。任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 您正在浏览图像中的所有标签,而TAGS没有34682 的条目。这并不意味着您仍然无法取出 PixelWidth 标签,因为丢失的标签可能与您无关。您可以使用TAGS.get(key) 而不是TAGS[key] 来避免在未找到的键上崩溃,并使用如下所示的循环来确定要打印的值。

标签: python metadata python-imaging-library tiff


【解决方案1】:

看起来您的文件可能是 FEI SEM TIFF,其中包含 TIFF 标记 34682 中类似 INI 的元数据。

尝试使用tifffile

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

【讨论】:

  • 我还想从蔡司显微镜上收集的图像中提取相同的校准因子。在这种情况下,在记事本中打开 .tif 文件不会显示可读文本。我希望进行简单的修改,以从蔡司图像中提取等效的 PixelWidth。浏览 tifffile.py 网页,看起来“tif.sem_metadata [...]”可能是这样做的方法。首先,我尝试: with tifffile.TiffFile(imagetoanalyze) as tif: metadata = tif.sem_metadata" 这将创建一个类型为“NoneType”且大小为 1 的对象“元数据”。知道如何查看/提取蔡司元数据吗?
  • 请分享文件。如果sem_metadata 返回无,则该文件不会被识别为蔡司 SEM 图像。
  • 我的错误:sem_metadata 实际上确实提取了图像元数据。看起来我尝试从中提取元数据的第一张蔡司图像可能没有任何保存。对于其他文件,sem_metadata 有效。再次感谢!
【解决方案2】:

使用 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[&lt;thatnumber&gt;] 而不填充字典。

【讨论】:

  • 谢谢!这消除了“KeyError:34682”,但给了我一个“meta_dict”对象,其中只有约 10% 的可用元数据值可由它们的各个键调用。剩下的 90% 可以在 meta_dict['missing'] 中找到,在由 "\r\"s 分隔的一大块文本中。
  • 所需的“PixelWidth”键恰好埋在这个 meta_dict['missing'] 文本中。
  • 无赖。很高兴 tifffile 解决方案对您有用。
  • 我还成功地使用了exiftool 进行一般图像元数据提取,包括 EM 比例类型。
猜你喜欢
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 2015-12-14
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多