首页 > 编程语言 >【Python入门教程】读取图片信息最全教程(经纬度、偏转角、无人机影像、大疆)

【Python入门教程】读取图片信息最全教程(经纬度、偏转角、无人机影像、大疆)

时间:2024-01-05 19:56:01浏览次数:37  
标签:读取 Python 入门教程 大疆 key print data ds 图片

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

1 GDAL读取

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

# -*- coding: utf-8 -*-
"""
@Time : 2023/06/21 11:52
@Auth : RS迷途小书童
@File :Read Image.py
@IDE :PyCharm
@Purpose:读取图片信息
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
import exifread
from osgeo import gdal


def Get_data(filepath):
    print("------------------------------------影像基础信息-----------------------------------")
    ds = gdal.Open(filepath)  # 打开数据集dataset
    ds_width = ds.RasterXSize  # 获取数据宽度
    ds_height = ds.RasterYSize  # 获取数据高度
    ds_bands = ds.RasterCount  # 获取波段数
    ds_geo = ds.GetGeoTransform()  # 获取仿射地理变换参数
    ds_prj = ds.GetProjection()  # 获取投影信息
    print("影像的宽度为:" + str(ds_width))
    print("影像的高度为:" + str(ds_height))
    print("波段数为:" + str(ds_bands))
    print("仿射地理变换参数为:" + str(ds_geo))
    print("投影坐标系为:" + str(ds_prj))
    # data = ds.ReadAsArray(0, 0, ds_width, ds_height)  # 以数组的形式读取整个数据集

2 exifread读取

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

# -*- coding: utf-8 -*-
"""
@Time : 2023/06/21 11:52
@Auth : RS迷途小书童
@File :Read Image.py
@IDE :PyCharm
@Purpose:读取图片信息
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
import exifread
from osgeo import gdal


def Get_LatLon(path_image):
    """
    :param path_image: 输入图片路径
    :return: 返回图片中心点经纬度
    """
    print("----------------------------------图片exifread信息---------------------------------")
    # 获取图片的经纬度信息
    f = open(path_image, 'rb')
    contents = exifread.process_file(f)
    for key, value in contents.items():
        if key in ["GPS GPSLongitude", "GPS GPSLatitude"]:
            value = contents[key].values[0].num/contents[key].values[0].den + \
                    (contents[key].values[1].num/contents[key].values[1].den/60) + \
                    (contents[key].values[2].num/contents[key].values[2].den/3600)
            # longitude = contents["GPS GPSLongitude"].values
            # longitude_f = longitude[0].num / longitude[0].den + (longitude[1].num / longitude[1].den / 60) + (
            #             longitude[2].num / longitude[2].den / 3600)
            # latitude = contents["GPS GPSLatitude"].values
            # latitude_f = latitude[0].num / latitude[0].den + (latitude[1].num / latitude[1].den / 60) + (
            #             latitude[2].num / latitude[2].den / 3600)
        elif key == "JPEGThumbnail":
            break
        print(f"{key}: {value}")
    f.close()

3 二进制模式读取

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

# -*- coding: utf-8 -*-
"""
@Time : 2023/06/21 11:52
@Auth : RS迷途小书童
@File :Read Image.py
@IDE :PyCharm
@Purpose:读取图片信息
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
import exifread
from osgeo import gdal



def Get_Image_Yaw_angle(file_path):
    """
    :param file_path: 输入图片路径
    :return: 图片的偏航角
    """
    # 获取图片偏航角
    print("----------------------------------大疆exifread信息---------------------------------")
    # 定义字节模式 b 和 a,用于查找大疆EXIF数据的起始和结束标记
    b = b"\x3c\x2f\x72\x64\x66\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e"
    a = b"\x3c\x72\x64\x66\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20"
    # 打开图片文件,以二进制模式读取
    img = open(file_path, 'rb')
    # 初始化一个字节数组用于存储EXIF数据
    data = bytearray()
    # 初始化一个标志,用于判断是否已经找到EXIF数据的起始标记
    flag = False
    # 逐行读取图片文件内容
    for line in img.readlines():
        # 如果当前行包含EXIF数据的起始标记,则设置标志为True
        if a in line:
            flag = True
            # 如果标志为True,则将当前行添加到EXIF数据中
        if flag:
            data += line
            # 如果当前行包含EXIF数据的结束标记,则跳出循环
        if b in line:
            break
            # 如果提取到的EXIF数据不为空
    dj_data_dict = {}
    # 遍历过滤后的行,并提取键值对存入字典中
    if len(data) > 0:
        # 将字节数据解码为ASCII字符串
        data = str(data.decode('ascii'))
        # 过滤出包含drone-dji的行,并分割每行为键值对
        lines = list(filter(lambda x: 'drone-dji:' in x, data.split("\n")))
        # 初始化一个空字典用于存储提取到的数据
        for d in lines:
            d = d.strip()[10:]  # 去除每行的前后空格和'\n'字符,并从第10个字符开始处理(因为drone-dji:占据了前9个字符)
            k, v = d.split("=")  # 将当前行分割为键和值两部分
            print(f"{k} : {v}")  # 打印键和值
            dj_data_dict[k] = v  # 将键值对存入字典中
    return dj_data_dict.get('YawAngle')  # 返回偏航角的值。如果未找到偏航角,则返回None。

4 总结

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

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

标签:读取,Python,入门教程,大疆,key,print,data,ds,图片
From: https://www.cnblogs.com/RSran/p/17947974

相关文章

  • 【Python&RS】栅格数据/图片位深度(bit)转换
    ​    关于栅格数据/图片的位深度(eg.8bit、16bit、32bit)转换之前我就发过一篇文章,【Python&RS】基于GDAL栅格数据/图片位深度(bit)转换。但是最近在使用的时候发现好像效果不行,有时候转换不成功,所以自己又研究了一下原理重新写了一份代码。今天就和大家分享一下如何使用Py......
  • 使用Python+selenium实现第一个自动化测试脚本
    这篇文章主要介绍了使用Python+selenium实现第一个自动化测试脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧最近在学web自动化,记录一下学习过程。此处我选用python3.6+selenium3.0,均用最新版本,以适应......
  • 30道python自动化测试面试题与答案汇总
    对于机器学习算法工程师而言,Python是不可或缺的语言,它的优美与简洁令人无法自拔,下面这篇文章主要给大家介绍了关于30道python自动化测试面试题与答案汇总的相关资料,需要的朋友可以参考下1、什么项目适合做自动化测试?关键字:不变的、重复的、规范的1)任务测试明确,需求不会频繁......
  • 学习python自动化——re正则
    re(正则)一、正则表达式作用正则表达式匹配指定规则的字符串二、re常用方法findall(pattern,string,flags=0):使用正则表达式,匹配所有符合条件的字符串,返回匹配到的所有子串,返回listpattern:正则表达式string:匹配的字符串flags=0:自定义的一些规则,比如不......
  • python与yum的修复
    装python3.10时删了python3.7,结果导致yum也完蛋了。恢复的思路:彻底删除python和yum后重装。一、删除:1、卸载现有pythonrpm-qa|greppython|xargsrpm-ev--allmatches--nodeps##卸载pythonwhereispython|xargsrm-frv##删除所有参与文件whereispython##......
  • 《python神经网络读书笔记》
    感想:人工智能是一门古老的学科,意思是人为的创造出和人类相似的智能体。在很多科幻影视作品中都有描述,甚至有的影视作品中不是使用计算机来实现人工智能。但是实际上这门学科在21世纪之前一直没什么进展。20世纪时,这门学科的主要研究方向是通过写一些强制判断逻辑来模拟智能体。......
  • Python flask 网页版执行shell命令并返回结果['GET', 'POST'] 混合方式
    前言全局说明Pythonflask网页版执行shell命令并返回结果一、需要安装的库pip3installflask-ihttp://pypi.douban.com/simple/--trusted-hostpypi.douban.compip3installsubprocess-ihttp://pypi.douban.com/simple/--trusted-hostpypi.douban.com二、inde......
  • optical strain(python)
    利用pythonopencv计算opticalstrainimportcv2importnumpyasnpclassOptFlowStrain:def__init__(self):self.TVL1=cv2.optflow.DualTVL1OpticalFlow_create()defrun(self,img0,img1):returnself.cal_opt_flow(img0,img1)def......
  • 在Python程序中读取和写入文件的方法
    在Python编程中,读取和写入文件是常见的操作。本文将介绍几种常用的方法来实现在Python程序中读取和写入文件。1.使用open()函数Python提供了内置的open()函数,可以用于打开一个文件,并返回一个文件对象,从而进行文件的读取和写入操作。open()函数接受两个参数:文件名和打开模式。示例代......
  • 使用Python爬取大麦网演出商品评论的方法
    在网络时代,用户对于商品的评论和评价是非常重要的参考依据。本文将介绍如何使用Python来爬取大麦网演出商品评论,以获取用户对演出的反馈和评价。1.确定目标页面首先,我们需要确定要爬取评论的目标页面。在大麦网上,每个演出商品都有一个唯一的商品ID,通过拼接URL可以访问到该商品的评......