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

        关于栅格数据/图片的位深度(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 gdaldef Repair_Bit(filepath, out_path):print("-------------------------------------Bit转换-------------------------------------")ds = gdal.Open(filepath)  # 打开数据集datasetds_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 = Nonedel array_resultds_result.SetGeoTransform(ds_geo)  # 导入仿射地理变换参数ds_result.SetProjection(ds_prj)  # 导入投影信息ds_result.GetRasterBand(1).SetNoDataValue(0)  # 将无效值设为0del 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位的范围才可以转换成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

批量转换QQ音乐音频文件格式:从FLAC、OGG到MP3

目录 工具和库批量转换脚本结语 我们经常需要将音频文件从一种格式转换为另一种以满足不同的需求。例如,从QQ音乐中下载的 FLAC格式虽然提供了无损的音质,但文件大小较大,不适合在所有设备上播放。而MP3格式由于其较小的文件大小和广泛的兼容…

创意无限:火星文和变异字体的魅力世界

在互联网的浩瀚星空里,火星文和变异字体如同璀璨的繁星,照亮了网络世界的角落。它们以独特的创意和视觉冲击力,吸引着无数网友的目光。让我们一起走进这个充满创意和想象力的世界,感受火星文和变异字体的无限魅力。 火星文生成器…

软件测试|SQL中的LIKE模糊匹配该怎么用?

简介 在SQL(Structured Query Language)中,LIKE是一种用于模糊匹配的操作符。通过使用LIKE,我们可以根据模式匹配的方式进行数据检索,而不仅仅局限于完全匹配。本文将详细介绍SQL中LIKE操作符的语法、用法以及一些示例…

全志F1C100s Linux 系统编译出错:不能连接 github

环境 Ubuntu 20.04 LTS 64 位虚拟机 开发板:Lichee Pi Nano 源代码:GitHub - florpor/licheepi-nano 问题描述 该源码库使用了 git 子模块的概念,一个库中包含了 u-boot、Linux等代码库。不需要分别编译,一个 make 全搞定 编译时提示错误: >>> linux-hea…

Halcon根据特征值选择区域select_shape

Halcon根据特征值选择区域 关于提取图像的特征,比较常用的一个算子是select_shape算子,它能高效地根据特征提取出符合条件的区域。该算子的原型如下: select_shape (Regions : SelectedRegions : Features, Operation, Min, Max :)参数1和参…

win和linux打印tree命令目录结构命令

win 输入tree: cmd: tree 显示文件夹不显示文件 可以用相对路径:tree .\test_pipreqs 省略.\也可以:tree test_pipreqs 显示文件 上面只显示文件夹未能显示文件。我们继续看下面: cmd: tree [path] [/f] [/a] ----------/f 显示每个文件中文件…

修改 Git 仓库的远程地址

要修改 Git 仓库的远程地址&#xff0c;你可以使用以下命令&#xff1a; 首先&#xff0c;查看当前的远程地址列表&#xff0c;使用命令 git remote -v。如果你想修改已存在的远程地址&#xff0c;可以使用命令 git remote set-url <remote_name> <new_url>。在这…

【论文阅读笔记】Mip-NeRF 360: Unbounded Anti-Aliased Neural Radiance Fields

目录 概述摘要引言参数化效率歧义性 mip-NeRF场景和光线参数化从粗到细的在线蒸馏基于区间的模型的正则化实现细节实验限制总结&#xff1a;附录退火膨胀采样背景颜色 paper&#xff1a;https://arxiv.org/abs/2111.12077 code&#xff1a;https://github.com/google-research/…

【LeetCode】601. 体育馆的人流量

表&#xff1a;Stadium ------------------------ | Column Name | Type | ------------------------ | id | int | | visit_date | date | | people | int | ------------------------ visit_date 是该表中具有唯一值的列。 每日人流量…

Android 项目工程配置签名文件

1. Android签名证书(.keystore) Android平台打包发布apk应用&#xff0c;需要使用数字证书&#xff08;.keystore文件&#xff09;进行签名&#xff0c;用于表明开发者身份。   Android证书的生成是自助和免费的&#xff0c;不需要审批或付费。   可以使用JRE环境中的keyto…

【UML建模】部署图(Deployment Diagram)

1.概述 部署图是一种结构图&#xff0c;用于描述软件系统在不同计算机硬件或设备上的部署和配置情况&#xff0c;以图形化的方式展示系统中组件、节点和连接之间的物理部署关系。 通过部署图&#xff0c;可以清晰地了解系统的物理结构和部署方式&#xff0c;包括系统组件和节…

使用免费工具在 Windows 11/10/8/7 中扩展 C 盘的 3 种方法

越来越多的Windows 10笔记本电脑和台式机使用SSD作为系统盘&#xff0c;这对于提高计算机性能很有用&#xff0c;因为SSD的读写速度要快得多。但另一方面&#xff0c;SSD价格更高&#xff0c;因此比传统机械硬盘体积更小。当然C盘空间不足的可能性更大。在这种情况下&#xff0…

在Docker中安装和配置InfluxDB,设置SSL和密码保护

在Docker中安装和配置InfluxDB&#xff0c;设置SSL和密码保护 引言 InfluxDB是一个开源的时间序列数据库&#xff0c;常用于存储和查询大量时序数据。通过使用Docker&#xff0c;我们可以轻松地部署和管理InfluxDB容器&#xff0c;并配置SSL以及设置用户名和密码进行保护。本博…

45. 跳跃游戏 II(Java)

题目描述&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到…

四种“栈溢出检测方法”实现分析(2种纯软件、一种纯硬件、一种软硬件结合)

1、两种纯软件的栈溢出检测方法 参考博客&#xff1a;《freeRTOS的栈溢出检测机制》&#xff1b; 2、纯硬件&#xff1a;使用栈限制寄存器 2.1、工作逻辑分析 前提条件&#xff1a;使用满减栈硬件上提供栈限制寄存器&#xff08;用SP_limit表示&#xff09;&#xff0c;可以…

如何将支持标准可观测性协议的中间件快速接入观测

前言 作为一名云原生工程师&#xff0c;如何将支持标准可观测性协议的中间件快速接入观测云呢&#xff1f;答案是只需要三步。 首先&#xff0c;需要确定您要观测的中间件类型。支持标准可观测性协议中间件可通过观测云的 DataKit 采集到中间件的关键指标。有些中间件自带可观…

数据库备份规范

备份方式 1、周期性例行备份 生产数据库例行备份统一使用定时任务备份&#xff0c;备份时间定时到业务低峰期。每天备份一次&#xff0c;保留7天的备份&#xff0c;超过7天的备份包括binlog上传到s3存储上。 2、线上数据库变更前备份。 分为自动变更和手动变更&#xff0c;遵…

【c++】入门3

引用 1.swap交换两个变量值的时候可以用引用 2.例题中通过前序遍历数组构建二叉树&#xff0c;可以用引用传别名. #include <stdio.h> #include <stdlib.h> typedef struct BinaryTreeNode {char data;struct BinaryTreeNode* left;struct BinaryTreeNode* right; …

八、Lua脚本详解—— 超详细操作演示!

八、Lua脚本详解 —— 超详细操作演示&#xff01; 八、Lua脚本详解8.1 Lua 简介8.2 Linux 系统的Lua8.2.1 Lua 下载8.2.2 Lua 安装8.2.3 Hello World 8.3 Win 系统的Lua8.4 Lua 脚本基础8.4.1 注释8.4.2 数据类型8.4.3 标识符8.4.4 运算符8.4.5 函数8.4.6 流程控制语句8.4.7 循…

Java web项目openSession和getCurrentSession切换

一.openSession 在配置文件配置sessionFactory-hibernateProperties添加 <prop key"hibernate.current_session_context_class">thread</prop> 二 .getCurrentSession 第一步&#xff1a; 去掉配置&#xff1a; <prop key"hibernate.current…