前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 获取图像 GPS 信息

Python 获取图像 GPS 信息

作者头像
为为为什么
发布2024-05-16 16:54:45
1020
发布2024-05-16 16:54:45
举报
文章被收录于专栏:又见苍岚又见苍岚

JPG 图像中经常会保存相机记录的图像拍摄位置的 GPS 信息,本文记录 Python 获取图像拍摄位置信息的方法。

简介

EXIF(Exchangeable Image File Format)是一种用于存储图像拍摄相关信息的标准,这些信息包括相机设置、拍摄时间、地点等。EXIF信息通常嵌入在JPEG、TIFF和RAW图像文件中,以便于软件和设备(如数字相机、手机、扫描仪)能够读取和使用这些信息。

在EXIF信息中,GPS信息是一个重要的组成部分,它可以提供关于图像拍摄位置的详细数据。以下是GPS信息可能包含的内容:

  1. GPS版本信息:表示EXIF中GPS信息的版本号。
  2. GPS国界:标识图像拍摄位置所在的国家或地区。
  3. GPS定位日期和时间:记录图像拍摄时的日期和时间。
  4. GPS卫星信息:显示在图像拍摄时,哪些卫星参与了GPS定位。
  5. GPS经度:表示图像拍摄位置的经度,通常以度、分、秒的形式表示。
  6. GPS纬度:表示图像拍摄位置的纬度,同样以度、分、秒的形式表示。
  7. GPS高度:以米为单位,表示图像拍摄位置相对于海平面的高度。
  8. GPS速度:表示图像拍摄时的移动速度,通常以千米/小时为单位。

通过这些GPS信息,我们可以了解到图像的拍摄位置、时间和拍摄时的运动状态。这些信息对于图片的归档、分享和地理信息系统(GIS)分析等方面非常有用。

Python 获取路线

可以在 Python 中很容易地获取到图像的 exif 信息,并从中提取 gps 信息,本质上都是从文件中读取 exif 信息字段,将其解析成我们可读的 gps 信息。

这里介绍三种实现方法:

  1. Pillow 路线
  2. piexif
  3. exifread

经度、纬度概念

  • 经度 Longitude , 本初子午线 位置 为 0 度经线 , 相当于水平 x 轴 的坐标 , 经度的取值范围 -180 度 ~ +180 度 ;
  • 纬度 Latitude , 相当于 垂直 y 轴 的坐标 , 纬度的取值范围 -90 度 ~ + 90 度 ;
  • 西经 和 南纬 是负数 ;

Pillow

安装

1

pip install Pillow

使用

上源码:

12345678910111213141516171819

from PIL import Image, ExifTagsdef pillow_get_exif_data(image_path): image = Image.open(image_path) # 获取图片的exif信息 exif_data = image._getexif() if exif_data is not None: # 使用自定义的函数转换exif标签 exif_data = { ExifTags.TAGSk: v for k, v in exif_data.items() if k in ExifTags.TAGS } return exif_dataif __name__ == '__main__': image_path = 'demo.jpg' exif_data = pillow_get_exif_data(image_path) print(exif_data'GPSInfo')

输出:

1

{0: b'\x02\x03\x00\x00', 1: 'N', 2: (31.0, 5.0, 37.6518), 3: 'E', 4: (121.0, 14.0, 54.4151), 5: b'\x00', 6: 93.606, 7: (2.0, 32.0, 54.0), 9: 'A', 18: 'WGS-84\x00', 29: '2024:05:04'}

含义:

  • 1 —— 南北
  • 2 —— 纬度(度分秒)
  • 3 —— 东西
  • 4 —— 经度(度分秒)
  • 6 —— 高度(米)

piexif

安装

1

pip install piexif

使用

上源码:

12345678910

import piexifdef piexif_get_exif_data(image_path): exif_dict = piexif.load(image_path) return exif_dictif __name__ == '__main__': image_path = 'demo.jpg' exif_data = piexif_get_exif_data(image_path) print(exif_data'GPS')

输出:

123456789101112131415161718192021

0:(2, 3, 0, 0)1:b'N'2:((31, 1), (5, 1), (376518, 10000))3:b'E'4:((121, 1), (14, 1), (544151, 10000))5:06:(93606, 1000)7:((2, 1), (32, 1), (54, 1))9:b'A'18:b'WGS-84\x00'

含义:

其中的 tuple 需要第一个数除以第二个数

  • 1 —— 南北
  • 2 —— 纬度(度分秒)
  • 3 —— 东西
  • 4 —— 经度(度分秒)
  • 6 —— 高度(米)

exifread

安装

1

pip install exifread

使用

上源码:

12345678910111213

import exifreaddef exifread_get_exif_data(image_path): f = open(image_path,'rb') contents = exifread.process_file(f) f.close() return contentsif __name__ == '__main__': image_path = 'demo.jpg' contents = exifread_get_exif_data(image_path) print(contents"GPS GPSLongitude", contents'GPS GPSLongitudeRef', contents"GPS GPSLatitude", contents'GPS GPSLatitudeRef', contents"GPS GPSAltitude")

输出:

1

121, 14, 544151/10000 E 31, 5, 188259/5000 N 46803/500

性能评估

连续运行一千次,统计时间:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455

from PIL import Image, ExifTagsimport mtutils as mtimport numpy as npimport piexifimport exifreadimport timedef piexif_get_exif_data(image_path): exif_dict = piexif.load(image_path) return exif_dictdef pillow_get_exif_data(image_path): image = Image.open(image_path) # 获取图片的exif信息 exif_data = image._getexif() if exif_data is not None: # 使用自定义的函数转换exif标签 exif_data = { ExifTags.TAGSk: v for k, v in exif_data.items() if k in ExifTags.TAGS } return exif_datadef exifread_get_exif_data(image_path): f = open(image_path,'rb') contents = exifread.process_file(f) f.close() return contents if __name__ == '__main__': image_path = 'demo.JPG' times = 1000 start = time.time() for _ in range(times): exif_data = pillow_get_exif_data(image_path) end = time.time() print(f'pillow_get_exif_data: {end - start}') start = time.time() for _ in range(times): exif_data2 = piexif_get_exif_data(image_path) end = time.time() print(f'piexif_get_exif_data: {end - start}') start = time.time() for _ in range(times): exifread_get_exif_data(image_path) end = time.time() print(f'exifread_get_exif_data: {end - start}') pass

输出:

123

pillow_get_exif_data: 0.94569993019104piexif_get_exif_data: 0.17222881317138672exifread_get_exif_data: 0.8518986701965332

结论piexif 又快又好用。

参考资料

文章链接: https://cloud.tencent.com/developer/article/2417969

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-5-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
    • Python 获取路线
    • 经度、纬度概念
    • Pillow
      • 安装
        • 使用
        • piexif
          • 安装
            • 使用
            • exifread
              • 安装
                • 使用
                • 性能评估
                • 参考资料
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档