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

时间:2016-04-15 09:58:22

标签: matlab metadata octave exif

在MATLAB中,我曾经去过:

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

就是这样。 Octave具有imfinfo函数,可从图像标题中读取许多参数,但显然不是ISO速度。这看起来很奇怪(为什么它会读取几十个参数并让ISO速度降低?)。

我有什么遗失的吗?

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

2 个答案:

答案 0 :(得分:3)

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值。基本上,您的文件上有一个表格,用于将标记(例如ExposureTimeFNumber)映射到其实际值。但是,标记名称不会在文件中编码。相反,每个标签具有整数值,例如,ExposureTimeFNumber将分别显示为33437和33434。将这些整数值映射到标记名称是程序/库的作用。

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

  

请注意,此标记在本标准版本中称为“ISOSpeedRatings”,最高版本为2.21。

如果您阅读更多规格,您会在附件G中找到以下说明:

  

[...] ID为34855的PhotographicSensitivity标签之前被称为ISOSpeedRating,实际上导致了对敏感度的混淆解释导致许多记录与ISO 12232标准中定义的ISO速度不同

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

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

修改

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

答案 1 :(得分:0)

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

  • 按照本主题前面的建议下载图像2.2.2
  • 在图像2.6.1中添加图像2.2.2中的readexif.m
  • 重新加载包pkg load image
  • 现在你可以打电话给readexif。获得ISOSpeedRating:

readexif(JPGPath).Exif_IFD_Pointer.ISOSpeedRatings