当前位置:   article > 正文

【Python入门教程】读取图片信息(经纬度、偏转角、无人机POS数据、大疆影像等)_无人机单张tif图片详细信息中有经纬度信息但python读取不到

无人机单张tif图片详细信息中有经纬度信息但python读取不到

        通常读取图片的属性信息(如经纬度、拍摄时间、IMU数据等)都是通过exifread库进行读取,但是有些图片用这个库读取的效果不好。所以今天我就和大家分享一下如何使用Python读取图片属性信息的三种方法。

原创作者:RS迷途小书童

博客地址:https://blog.csdn.net/m0_56729804?type=blog

1 GDAL读取

        GDAL库是用来处理卫星影像的库,它同样可以读取普通的jpg、png格式的图片,可以查看图片的行列数、波段数、坐标系等信息。

  1. # -*- coding: utf-8 -*-
  2. """
  3. @Time : 2023/06/21 11:52
  4. @Auth : RS迷途小书童
  5. @File :Read Image.py
  6. @IDE :PyCharm
  7. @Purpose:读取图片信息
  8. @Web:博客地址:https://blog.csdn.net/m0_56729804
  9. """
  10. import exifread
  11. from osgeo import gdal
  12. def Get_data(filepath):
  13. print("------------------------------------影像基础信息-----------------------------------")
  14. ds = gdal.Open(filepath) # 打开数据集dataset
  15. ds_width = ds.RasterXSize # 获取数据宽度
  16. ds_height = ds.RasterYSize # 获取数据高度
  17. ds_bands = ds.RasterCount # 获取波段数
  18. ds_geo = ds.GetGeoTransform() # 获取仿射地理变换参数
  19. ds_prj = ds.GetProjection() # 获取投影信息
  20. print("影像的宽度为:" + str(ds_width))
  21. print("影像的高度为:" + str(ds_height))
  22. print("波段数为:" + str(ds_bands))
  23. print("仿射地理变换参数为:" + str(ds_geo))
  24. print("投影坐标系为:" + str(ds_prj))
  25. # data = ds.ReadAsArray(0, 0, ds_width, ds_height) # 以数组的形式读取整个数据集

2 exifread读取

        这个就是最普遍的读取图片信息的库了,读取的属性值也有很多。如经纬度、时间、相机参数等等。

  1. # -*- coding: utf-8 -*-
  2. """
  3. @Time : 2023/06/21 11:52
  4. @Auth : RS迷途小书童
  5. @File :Read Image.py
  6. @IDE :PyCharm
  7. @Purpose:读取图片信息
  8. @Web:博客地址:https://blog.csdn.net/m0_56729804
  9. """
  10. import exifread
  11. from osgeo import gdal
  12. def Get_LatLon(path_image):
  13. """
  14. :param path_image: 输入图片路径
  15. :return: 返回图片中心点经纬度
  16. """
  17. print("----------------------------------图片exifread信息---------------------------------")
  18. # 获取图片的经纬度信息
  19. f = open(path_image, 'rb')
  20. contents = exifread.process_file(f)
  21. for key, value in contents.items():
  22. if key in ["GPS GPSLongitude", "GPS GPSLatitude"]:
  23. value = contents[key].values[0].num/contents[key].values[0].den + \
  24. (contents[key].values[1].num/contents[key].values[1].den/60) + \
  25. (contents[key].values[2].num/contents[key].values[2].den/3600)
  26. # longitude = contents["GPS GPSLongitude"].values
  27. # longitude_f = longitude[0].num / longitude[0].den + (longitude[1].num / longitude[1].den / 60) + (
  28. # longitude[2].num / longitude[2].den / 3600)
  29. # latitude = contents["GPS GPSLatitude"].values
  30. # latitude_f = latitude[0].num / latitude[0].den + (latitude[1].num / latitude[1].den / 60) + (
  31. # latitude[2].num / latitude[2].den / 3600)
  32. elif key == "JPEGThumbnail":
  33. break
  34. print(f"{key}: {value}")
  35. f.close()

3 二进制模式读取

        这个方法仅适用于部分的相机拍摄的图片,如大疆、长光禹辰等。因为它是通过二进制编码进行读取,所以如果图片的二进制编码中不包含代码中的编码就读取不出来。

  1. # -*- coding: utf-8 -*-
  2. """
  3. @Time : 2023/06/21 11:52
  4. @Auth : RS迷途小书童
  5. @File :Read Image.py
  6. @IDE :PyCharm
  7. @Purpose:读取图片信息
  8. @Web:博客地址:https://blog.csdn.net/m0_56729804
  9. """
  10. import exifread
  11. from osgeo import gdal
  12. def Get_Image_Yaw_angle(file_path):
  13. """
  14. :param file_path: 输入图片路径
  15. :return: 图片的偏航角
  16. """
  17. # 获取图片偏航角
  18. print("----------------------------------大疆exifread信息---------------------------------")
  19. # 定义字节模式 b 和 a,用于查找大疆EXIF数据的起始和结束标记
  20. b = b"\x3c\x2f\x72\x64\x66\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e"
  21. a = b"\x3c\x72\x64\x66\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20"
  22. # 打开图片文件,以二进制模式读取
  23. img = open(file_path, 'rb')
  24. # 初始化一个字节数组用于存储EXIF数据
  25. data = bytearray()
  26. # 初始化一个标志,用于判断是否已经找到EXIF数据的起始标记
  27. flag = False
  28. # 逐行读取图片文件内容
  29. for line in img.readlines():
  30. # 如果当前行包含EXIF数据的起始标记,则设置标志为True
  31. if a in line:
  32. flag = True
  33. # 如果标志为True,则将当前行添加到EXIF数据中
  34. if flag:
  35. data += line
  36. # 如果当前行包含EXIF数据的结束标记,则跳出循环
  37. if b in line:
  38. break
  39. # 如果提取到的EXIF数据不为空
  40. dj_data_dict = {}
  41. # 遍历过滤后的行,并提取键值对存入字典中
  42. if len(data) > 0:
  43. # 将字节数据解码为ASCII字符串
  44. data = str(data.decode('ascii'))
  45. # 过滤出包含drone-dji的行,并分割每行为键值对
  46. lines = list(filter(lambda x: 'drone-dji:' in x, data.split("\n")))
  47. # 初始化一个空字典用于存储提取到的数据
  48. for d in lines:
  49. d = d.strip()[10:] # 去除每行的前后空格和'\n'字符,并从第10个字符开始处理(因为drone-dji:占据了前9个字符)
  50. k, v = d.split("=") # 将当前行分割为键和值两部分
  51. print(f"{k} : {v}") # 打印键和值
  52. dj_data_dict[k] = v # 将键值对存入字典中
  53. return dj_data_dict.get('YawAngle') # 返回偏航角的值。如果未找到偏航角,则返回None。

4 总结

        上面就是三种读取图片属性信息的方法,基本覆盖了市面上的所有相机拍摄的图片。我平时最常用它的就是用其读取无人机影像的POS数据。

        本文章主要是分享个人在学习Python过程中写过的一些代码。有些部分参考了前人以及官网的教程,如有侵权请联系作者删除,大家有问题可以随时留言交流,博主会及时回复。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/590156
推荐阅读
相关标签
  

闽ICP备14008679号