首页 > 编程语言 >【Python&RS】基于Python对栅格数据进行归一化(统一量纲至0~1)

【Python&RS】基于Python对栅格数据进行归一化(统一量纲至0~1)

时间:2023-12-27 16:24:15浏览次数:37  
标签:RS Python result 归一化 print array ds


        有段时间没有更新Python处理栅格、矢量数据了,一部分是因为之前基本上已经把如何使用Python处理地理数据的方法覆盖完了,另一部分是因为最近有其他方面的知识需要学习和巩固。也是赶巧,最近有个项目需要构建模型对影像进行反演需要用到归一化,所以就编了一段代码,今天就和大家分享一下如何使用Python对栅格数据进行归一化的操作。

1 原理

   归一化是一种简化计算的方式,即将有量纲的表达式经过变换化为无量纲的表达式,成为标量。在多种计算中都经常用到这种方法。归一化是一种无量纲处理手段,使物理系统数值的绝对值变成某种相对值关系。

        我这里使用的是最常规的归一化算法,即最大-最小归一化,将数值归一化至0~1之间,公式如下:

 Y = (X - Xmin) / (Xmax - Xmin)

2 Python代码

        既然原理搞懂了,接下来就是代码。代码部分也很简单,和之前计算NDVI差不多。

# -*- coding: utf-8 -*-
"""
@Time : 2023/12/26 11:52
@Auth : RS迷途小书童
@File :Normalization of Raster Data.py
@IDE :PyCharm
@Purpose:栅格数据归一化
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
import numpy as np
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_geo))
    print("投影坐标系为:" + str(ds_prj))
    # data = ds.ReadAsArray(0, 0, ds_width, ds_height)  # 以数组的形式读取整个数据集


def Normalization_value(filepath, out_path):
    print("-------------------------------------归一化处理-------------------------------------")
    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_Float64)
    print("正在遍历所有波段......")
    for i in range(1, ds.RasterCount):  # 遍历所有波段
        array_band = ds.GetRasterBand(i).ReadAsArray(0, 0, ds_width, ds_height).astype(np.float64)
        min_value = np.min(array_band)  # 获取最小值
        max_value = np.max(array_band)  # 获取最大值
        array_result = (array_band-min_value)/(max_value-min_value)
        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")
    # os.environ['PROJ_LIB'] = 'G:/Anaconda/envs/pyDL/Lib/site-packages/osgeo/data/proj'
    # os.environ['GDAL_DATA'] = 'G:/Anaconda/envs/pyDL/Lib/site-packages/osgeo/data'
    # 添加PROJ至环境变量,消除警告
    file_path = r"彭俊喜/MS600_0009_Multi.tif"  # 输入的栅格数据路径
    out_path1 = r"彭俊喜\test2.tif"  # 导出的文件路径
    Get_data(file_path)  # 执行函数,获取影像基本信息
    Normalization_value(file_path, out_path1)
    print("--------------------------------------程序结束--------------------------------------")

        如果大家在学习Python或者RS时有什么问题,可以随时留言交流!如果大家对批量处理有兴趣同样可以留言给博主,博主会分享相关代码以供学习!

标签:RS,Python,result,归一化,print,array,ds
From: https://www.cnblogs.com/RSran/p/17930791.html

相关文章

  • Python采集html页面时如何去除掉script,link等指定html标签
    python爬虫去除html中特定标签、去除注释、替换实体前言:本文主要讲w3lib库的四个函数html.remove_tags()html.remove_tags_with_content()html.remove_comments()html.remove_entities()remove_tags作用:去除或保留标签,但是仅仅是去除标签,正文部分是不做处理的 看其函数......
  • script, first, second, third = argv
    fromsysimportargv#从Python的特性库中引入argv特性到自己的脚本中#readtheWYSSsectionforhowtorunthisscript,first,second,third=argv#解包argv,并依次赋值给左边的变量print("Thescriptiscalled:",scr......
  • python代码pycharm 中可以运行 vscode无法运行
    问题:pycharm中可以运行,切到vscode中时无法运行,都是路径无法读取到导致模块无法加载。分析:主要原因有可能是VSCode默认使用项目文件夹根目录作为工作目录(cwd),这会使得子文件夹中的程序无法使用相对路径。vscode中设置一下:文件=>首选项=>设置中搜索ExecuteinFileDir,......
  • centos 7.9 安装 python 3.10.5 和 openssl 3.0.12
    centos编译安装python和openssl安装环境:centos7.9:python3.10.5和openssl3.0.12centos6.10:python3.10.5和openssl1.1.1两个环境都能安装成功,可以正常使用。安装openssl下载地址下载后解压,进入到解压目录执行:./Configure--prefix=/usr/local/openssl3.......
  • 怎么用 python 项目函数实现字符串反转
    字符串反转是一个常见的操作,可以通过Python函数轻松实现。在本文中,我们将探讨如何使用Python函数来反转字符串,无论是针对单个字符串还是列表中的多个字符串。1.反转单个字符串要反转单个字符串,我们可以使用Python的切片功能或者内置的reversed()函数。使用切片功能defrevers......
  • Python 爬虫与网络安全有什么关系
    Python爬虫和网络安全之间存在密切的关系。爬虫是一种用于自动化从网络上获取信息的程序,而网络安全是保护计算机网络和系统免受未经授权的访问、攻击和数据泄露的实践。本文将探讨Python爬虫与网络安全之间的关系以及如何在爬虫开发中注意网络安全。爬虫的作用和风险爬虫通常用于从......
  • 怎样实现使用python实现自动排班
    自动排班是一项常见的任务,可以使用Python编程语言来实现。本文将介绍如何使用Python实现自动排班的步骤和技术。步骤一:收集排班需求和数据首先,您需要收集排班的需求和相关数据。这可能包括员工的工作时间、班次要求、休假时间等。您可以将这些数据存储在Excel表格、数据库或其他数......
  • 如何快速还原Python内置模块的功能
    Python作为一门开源的编程语言,提供了丰富的内置模块和库,使开发者能够快速开发各种应用。然而,有时候我们可能在使用内置模块时不小心修改了其源代码,导致功能不正常或无法正常使用。本文将介绍如何快速还原Python内置模块的功能,以便恢复正常的开发环境。步骤一:确认问题首先,我们需要确......
  • 解决Python项目部署到服务器上的编码问题
    在将Python项目部署到服务器上时,经常会遇到编码问题,例如中文乱码、字符集不匹配等。这些问题可能导致项目无法正常运行或显示正确的内容。本文将介绍如何解决Python项目部署到服务器上的编码问题,以确保项目能够在服务器上正常运行。步骤一:确认编码问题首先,我们需要确认是否存在编码......
  • Python windows下subprocess模块 cwd 参数不支持相对路径
    前言全局说明Pythonwindows下subprocess模块cwd参数不支持相对路径一、问题程序要执行命令,用到了subprocess模块,并指定了cwd运行路径,在MAC系统下运行正常,在Windows下运行报错。经过查询,是系统差异导致,所以为了方便,在windows下获取当前路径后拼接再生成绝对路径......