详解如何在Python中提取图像元数据

  • Post category:Python

提取图像元数据是对于图像分析、图像处理、计算机视觉等领域都是一个非常重要的环节,Python提供了许多库可以方便地提取图像元数据。

本文将介绍如何在Python中提取图像元数据的完整攻略,过程中示例使用了 Pillow 库作为演示。

安装所需库

在开始提取图像元数据之前,需要使用Pillow库来解码图像数据并获取元数据。可以使用pip工具安装Pillow库:

!pip install Pillow

提取图像元数据

在Python中,使用 Image 模块可以读取图像文件。然后,使用 Image 对象中的 getexif() 方法返回一个包含元数据的字典,getexif() 方法的返回值为 None 表示没有发现元数据。

下面是一个示例来展示如何使用Pillow库在Python中提取图像元数据:

from PIL import Image
import pprint

with Image.open('example.jpg') as img:
    exif_data = img.getexif()
    pprint.pprint(exif_data)

上述代码中,先打开文件example.jpg,然后使用getexif()方法获取图像的元数据,并利用pprint库打印出来。在getexif()方法中提取的数据是一个Python字典,其中包含了各种元数据标签,这些标签通常包含在 Exif 规范中定义的属性中。

输出如下:

{...,
 36867: '2021:04:29 19:32:54',
 36868: '2021:04:29 19:32:54',
 37122: b'\x01\x02\x03\x00',
 37377: (4129, 3712),
 37378: (1936, 1096),
 ...}

从输出可以看到,字典中的键是一个整数,对应元数据的标签(也称为 Exif 标识符),而值是元数据的内容。

示例1:提取照片的日期信息

提取照片的日期信息对于许多应用程序而言是非常有用的。例如,我们可以使用日期信息来组织图像库,例如按照年份、月份等方式进行分类。

下面是一个示例,展示了如何使用Pillow库提取照片的日期信息:

with Image.open('example.jpg') as img:
  exif_data = img.getexif()
  if 36867 in exif_data:
      date_time = exif_data[36867]
      print(date_time)

通过上述代码我们可以提取出图像的拍摄日期。在上面的代码中,if语句检查是否存在元数据标签36867,如果存在,就使用它来获取日期信息。

输出结果如下:

2021:04:29 19:32:54

示例2:提取照片的GPS信息

另一个有用的元数据信息是照片的GPS信息,通过掌握GPS信息,便可在地图上标记照片的地理位置,可以用于将普通照片转化为地图上的点。

下面是一个示例,展示如何使用Pillow库提取照片的GPS信息:

with Image.open('example.jpg') as img:
    exif_data = img.getexif()
    if exif_data:
        gps_info = exif_data.get(34853)
        if gps_info:
            for key in gps_info.keys():
                print('{} : {}'.format(GPS_TAGS.get(key, key), gps_info[key]))

在这个示例中,使用了包含GPS信息的标签34853,在get()方法中传入34753来获取GPS信息。在返回了GPS信息的字典中,我们可以遍历其中所有的键和对应的值,然后通过GPS标签字典GPS_TAGS将标签转化为易于理解的文本。

输出结果如下:

GPSLatitudeRef : N
GPSLatitude : (35, 56, 31.5122)
GPSLongitudeRef : W
GPSLongitude : (79, 16, 43.3556)
GPSAltitudeRef : 0
GPSAltitude : 15270/881
GPSTimeStamp : (23, 32, 55)
GPSDateStamp : 2021:04:30

通过上述代码,我们可以得到照片的GPS位置,并将照片的位置数据转换为可以在地图上标记的值。

以上就是提取图像元数据的完整攻略,使用Pillow库就可以方便地获取图像元数据。