首页 > 编程语言 >【Python&RS】栅格数据/图片位深度(bit)转换

【Python&RS】栅格数据/图片位深度(bit)转换

时间:2024-01-05 19:47:09浏览次数:41  
标签:RS Python image 栅格数据 result print path ds gdal

        关于栅格数据/图片的位深度(eg.8bit、16bit、32bit)转换之前我就发过一篇文章,【Python&RS】基于GDAL栅格数据/图片位深度(bit)转换。但是最近在使用的时候发现好像效果不行,有时候转换不成功,所以自己又研究了一下原理重新写了一份代码。今天就和大家分享一下如何使用Python对图片的位深度进行转换。

1 读取图片位深度信息

        通过这个函数可以帮助我们在进行位深数转换之前了解图片的基本信息。

def Read_Bit(image_path):
    ds = gdal.Open(image_path)
    # 获取第一个波段
    data_type = gdal.GetDataTypeName(ds.GetRasterBand(1).DataType).lower()
    # 获取位深度信息
    print("图像的位深度为:", data_type)

2 Python代码

        原理呢其实就是将图片的数组除以当前位深数再乘以目标位深数范围即可,就和归一化的原理差不多。

# -*- coding: utf-8 -*-
"""
@Time : 2024/1/4 10:19
@Auth : RS迷途小书童
@File :Raster Data Bit Converse.py
@IDE :PyCharm
@Purpose:多波段栅格数据位深数转换
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
import os
import numpy as np
from osgeo import gdal


def Repair_Bit(filepath, out_path):
    print("-------------------------------------Bit转换-------------------------------------")
    ds = gdal.Open(filepath)  # 打开数据集dataset
    ds_width = ds.RasterXSize  # 获取数据宽度
    ds_height = ds.RasterYSize  # 获取数据高度
    ds_geo = ds.GetGeoTransform()  # 获取仿射地理变换参数
    ds_prj = ds.GetProjection()  # 获取投影信息
    driver = gdal.GetDriverByName('GTiff')  # 载入数据驱动,用于存储内存中的数组
    ds_result = driver.Create(out_path, ds_width, ds_height, bands=ds.RasterCount, eType=gdal.GDT_Int16)
    print("正在遍历影像所有波段......")
    for i in range(1, ds.RasterCount):  # 遍历所有波段
        array_band = ds.GetRasterBand(i).ReadAsArray(0, 0, ds_width, ds_height).astype(np.float32)
        array_result = array_band/4294967295.0*65535.0  # 32位转16位
        # int8  [-128, 127]
        # int16 [-32768, 32767]
        # int32 [-2147483648, 2147483647]
        # int64 [-9223372036854775808, 9223372036854775807]
        # uint8  [0, 255]
        # uint16 [0, 65535]
        # uint32 [0, 4294967295]
        # uint64 [0, 18446744073709551615]
        ds_result.GetRasterBand(i).WriteArray(array_result)  # 将结果写入数组
        array_result = None
        del array_result
    ds_result.SetGeoTransform(ds_geo)  # 导入仿射地理变换参数
    ds_result.SetProjection(ds_prj)  # 导入投影信息
    ds_result.GetRasterBand(1).SetNoDataValue(0)  # 将无效值设为0
    del ds_result
    # 删除内存中的结果,否则结果不会写入图像中
    print("当前影像位深数转换已完成......")


if __name__ == "__main__":
    print("\n")
    gdal.PushErrorHandler('CPLQuietErrorHandler')
    image_path1 = r"彭俊喜/1/"
    out_path1 = r"彭俊喜/2/"
    path = os.listdir(image_path1)
    for image in path:
        if image.endswith(".tif"):
            print("正在处理", image)
            Repair_Bit(image_path1+image, out_path1+image)
    print("--------------------------------------程序结束--------------------------------------")

3 总结

        这个方法呢我用的还可以,但是要注意输入数据的格式是否满足对应位深数。比如有的数据是16位的,但它的像素值却不是0-65535,这个时候可能就需要现在数据还原成16位的范围才可以转换成功。

标签:RS,Python,image,栅格数据,result,print,path,ds,gdal
From: https://www.cnblogs.com/RSran/p/17947944

相关文章

  • 使用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:自定义的一些规则,比如不......
  • 使用Power Automate获取Dataverse数据作为Excel附件发送邮件
    这是我的第506篇原创文章,写于2024年1月5日。之前我写过一篇文章 使用PowerAutomate获取CDS中数据并附加到邮件中发送,发送的是CSV,如果要发送Excel呢?今天我根据 CreateAnExcelFileAndAddRowsUsingPowerAutomate 的文章来做个发送Excel的例子。我创建一个Manuallytrigg......
  • python与yum的修复
    装python3.10时删了python3.7,结果导致yum也完蛋了。恢复的思路:彻底删除python和yum后重装。一、删除:1、卸载现有pythonrpm-qa|greppython|xargsrpm-ev--allmatches--nodeps##卸载pythonwhereispython|xargsrm-frv##删除所有参与文件whereispython##......
  • 《python神经网络读书笔记》
    感想:人工智能是一门古老的学科,意思是人为的创造出和人类相似的智能体。在很多科幻影视作品中都有描述,甚至有的影视作品中不是使用计算机来实现人工智能。但是实际上这门学科在21世纪之前一直没什么进展。20世纪时,这门学科的主要研究方向是通过写一些强制判断逻辑来模拟智能体。......
  • EF CodeFirst mysql 迁移异常Unable to create a 'DbContext' of type
    问题过程终端执行dotnetefmigrationsaddinit出现如下错误:Pomelo.EntityFrameworkCore.MySqlMicrosoft.EntityFrameworkCore.ToolsUnabletocreatea'DbContext'oftype''.Theexception'Methodnotfound:'VoidCoreTypeMappingParameters......
  • 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......
  • pytorch反向传播错误解决:RuntimeError: Trying to backward through the graph a seco
    pytorch反向传播错误解决:错误:RuntimeError:Tryingtobackwardthroughthegraphasecondtime,butthebuffershavealreadybeenfreed.Specifyretain_graph=Truewhencallingbackwardthefirsttime.归因排查:出现这种错误有可能是反向传播过程中出现了二次传播,......