如何在 Octave 中读取图像的 ISO 速度?

How to read ISO Speed of an image in Octave?

在 MATLAB 中我曾经去:

info = imfinfo('image.jpg');
iso = info.DigitalCamera.ISOSpeedRatings; 

就是这样。 Octave 有一个 imfinfo 函数,可以从图像 header 中读取许多参数,但显然不是 ISO 感光度。这对我来说很奇怪(为什么它会读取几十个参数并放出 ISO 速度?)。

有什么我遗漏的吗?

示例图像是 here,使用数码单反相机拍摄(如您在 imfinfo 中看到的那样)。使用 MATLAB,我可以清楚地看到 imfinfo('image.jpg').DigitalCamera.ISOSpeedRatings200.

tl;博士

您想要的值在字段 PhotographicSensitivity 下。使用:

iso = imfinfo ("image.jpg").DigitalCamera.PhotographicSensitivity;

参见Octave bug #47706。 Octave 只考虑遵循 Exif 2.3 版本的标签。

解决方法

Octave 图像包的旧版本有一个函数 readexif(该函数在图像包版本 2.2.0 中已弃用并在版本 2.4.0 中删除)可能能够读取它们。包含该功能的最后一个版本是 2.2.2

讨论

您正在访问的详细信息是图像文件中的 EXIF 值。基本上,您的文件中有一个 table 将标签(例如 ExposureTimeFNumber)映射到它们的实际值。但是,标签名称未在文件中编码。相反,每个标签都有一个整数值,例如 ExposureTimeFNumber 将分别显示为 33437 和 33434。 program/library 的工作是将这些整数值映射到标签名称。

根据 EXIF specs version 2.3(2010 年发布的最新规范),您要查找的标签 ISOSpeedRatings 不是有效的 EXIF 标签。它已重命名为 PhotographicSensitivity。如果您阅读该标签下的规格,您会发现这条注释:

Note that this tag was referred to as “ISOSpeedRatings” in versions of this standard up to Version 2.21.

如果您阅读更多规范,您会在附件 G 中找到以下解释:

[...] the PhotographicSensitivity tag whose ID was 34855 was previously referred to as ISOSpeedRating, which, in reality, led to confused interpretations of sensitivity that resulted in many recordings that differed from ISO speed as defined under the ISO 12232 standard.

如果您阅读更多规范,您会注意到带有标签 34855 的值的含义在其名称更改时略有变化。这意味着这不仅是标签名称问题,如果您的相机遵循不同版本的 EXIF 规范,其含义也会有所不同(假设您的相机正确记录了它,请记住更改的原因是相机记录了错误的东西).

我不确定什么是正确的技术答案。我猜一个程序应该检查记录的 ExifVersion(即 EXIF 标签 36864)并根据它更改标签名称。

编辑

Octave 使用 GraphicsMagick 读取图像,包括其元数据。 GraphicsMagick 不接受 EXIF 标签编号,程序需要使用标签名称进行查询。 Octave 然后有一个硬编码的标签名称列表,但只包含 Exif 规范 2.3 的标签。 GraphicsMagick 似乎识别出您的文件是旧版本的 Exif 并以 Octave 不要求的旧方式命名标签。

我做了以下操作,现在可以在图像 2.6.1 中使用 2.2.2 的 readexif:

  • 按照本帖前面的建议下载 Image 2.2.2
  • 在图2.6.1
  • 中添加图2.2.2的readexif.m
  • 重新加载包pkg load image
  • 现在可以调用readexif了。要获得 ISOSpeedRating:

readexif(JPGPath).Exif_IFD_Pointer.ISOSpeedRatings