本文主要是介绍【PythonRS】基于GDAL栅格数据/图片位深度(bit)转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近在用OpenCv库处理图片时发现cv库无法读取64位的tif影像,所有想通过Python将64位的图片转换成8位的。今天就跟大家分享一下如何利用Python的GDAL库,实现栅格数据/图片的位深度转换。
在数字图像处理中,我们常常会听到不同的位数术语,比如64位、16位和8位。这些位数指的是图像的深度,也就是图像中每个像素可以显示的颜色数。位数越高,图像可以显示的颜色数就越多,图像的质量也就越高。
图片位数是用来描述图像中每个像素可以显示的颜色数的一个指标。它决定了图像中每个像素可以使用的颜色数量,也就是图像的深度。位数越高,图像的深度就越高,可以显示的颜色数也就越多。
一、导入Python库
import numpy as np
from osgeo import gdal
二、获取影像基础信息
def Get_data(filepath):ds = gdal.Open(filepath) # 打开数据集datasetds_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) # 以数组的形式读取整个数据集
三、位深度转换
这里是通过创建空的数组,将数组的类型设定为8位实现位深度的转换。
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() # 获取投影信息
driver = gdal.GetDriverByName('GTiff') # 载入数据驱动,用于存储内存中的数组
ds_result = driver.Create(out_path, ds_width, ds_height, bands=ds_bands, eType=gdal.GDT_Byte)
# 创建一个数组,宽高为原始尺寸,类型为8bit
ds_result.SetGeoTransform(ds_geo) # 导入仿射地理变换参数
ds_result.SetProjection(ds_prj) # 导入投影信息
for i in range(1, ds_bands):# 循环所有波段print("正在处理第%s个波段" % i)array_band = ds.GetRasterBand(i).ReadAsArray(0, 0, ds_width, ds_height).astype(np.float64)ds_result.GetRasterBand(i).SetNoDataValue(0) # 将无效值设为0ds_result.GetRasterBand(i).WriteArray(array_band) # 将结果写入数组
del ds_result
# 删除内存中的结果,否则结果不会写入图像中
这篇文章没有啥能说的,大部分操作都是我之前分享过的,感兴趣的可以看看我之前发的文章顺便再给我点个赞。
这篇关于【PythonRS】基于GDAL栅格数据/图片位深度(bit)转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!