【Python&RS】基于GDAL的遥感影像压缩

        最近在处理一些高空间分辨率的卫星数据,数据量非常大。一个图幅都几十个G,ENVI表示压力太大了根本跑不动。所以研究了一下影像压缩的方式,在ArcGIS导出的压缩方式有很多限制,而且压缩并不是很明显。

        所以我尝试使用GDAL库对影像进行压缩,速度还可以,至少不会向ArcGIS一样未响应。压缩之后效果跟ArcGIS差不多,但是也达不到十几个G,压缩成几百兆的效果。毕竟遥感影像最重要的就是像素值,别为了压缩牺牲了质量,这就得不偿失了。

原创作者:RS迷途小书童

博客地址:https://blog.csdn.net/m0_56729804?type=blog

一、安装三方库

import os
from osgeo import gdal

二、压缩函数

        这里使用到GDAL的CreateCopy函数,在这里面可以设置压缩的参数。网上有很多人说LZW的压缩效果比PACKBITS好,但我在实测中发现PACKBITS的效果更好一点,可能因影像而已吧。不过庆幸的是两者都是无损压缩,我对比了压缩前后的像素值,均为一致的。

def Image_Compress(path_image, path_out_image):
    """
    :param path_image: 输入需要压缩的影像路径
    :param path_out_image: 输出压缩后的影像路径
    :return: None
    """
    ds = gdal.Open(path_image)
    # 打开影像数据
    driver = gdal.GetDriverByName('GTiff')
    # 创建输出的数据驱动
    driver.CreateCopy(path_out_image, ds, strict=1, callback=Show_Progress,
                      options=["TILED=YES", "COMPRESS=PACKBITS", "BIGTIFF=YES"])
    # 设置压缩参数
    """
    PACKBITS:连续字节压缩,快速无损压缩
    LZW:所有信息全部保留(可逆),以某一数值代替字符串,快速无损压缩
    """
    del ds

三、回调函数(显示进度)

        这个可以没有,将第压缩函数中的callback参数删除即可。作用就是用来显示压缩进度的。

def Show_Progress(percent, msg, tag):
    """
    :param percent: 进度,0~1
    :param msg:
    :param tag:
    :return:
    """
    if 0 <= percent * 100 <= 1:
        print("进度:" + "%.2f" % (0 * 100) + "%")
    if 25 <= percent*100 <= 26:
        print("进度:" + "%.2f" % (percent*100) + "%")
    if 50 <= percent*100 <= 51:
        print("进度:" + "%.2f" % (percent*100) + "%")
    if 75 <= percent*100 <= 76:
        print("进度:" + "%.2f" % (percent*100) + "%")
    if 99 <= percent * 100 <= 100:
        print("进度:" + "%.2f" % (1 * 100) + "%")

四、压缩效果展示

        这里用到了os的getsize函数,用来直观的显示压缩前后的空间占用率,当然也可以不要。纯属为了水一水字数(手动滑稽)。

def Get_Size(path_file):
    """
    :param path_file: 需要压缩影像的路径
    :return: 返回占用多少M
    """
    size = os.path.getsize(path_file)
    size = size / float(1024 * 1024)
    return round(size, 2)

五、完整代码

# -*- coding: utf-8 -*-
"""
@Time : 2023/6/20 14:20
@Auth : RS迷途小书童
@File :Image Compression.py
@IDE :PyCharm
@Purpose :遥感影像压缩
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
import os
from osgeo import gdal


def Show_Progress(percent, msg, tag):
    """
    :param percent: 进度,0~1
    :param msg:
    :param tag:
    :return:
    """
    if 0 <= percent * 100 <= 1:
        print("进度:" + "%.2f" % (0 * 100) + "%")
    if 25 <= percent*100 <= 26:
        print("进度:" + "%.2f" % (percent*100) + "%")
    if 50 <= percent*100 <= 51:
        print("进度:" + "%.2f" % (percent*100) + "%")
    if 75 <= percent*100 <= 76:
        print("进度:" + "%.2f" % (percent*100) + "%")
    if 99 <= percent * 100 <= 100:
        print("进度:" + "%.2f" % (1 * 100) + "%")


def Image_Compress(path_image, path_out_image):
    """
    :param path_image: 输入需要压缩的影像路径
    :param path_out_image: 输出压缩后的影像路径
    :return: None
    """
    ds = gdal.Open(path_image)
    # 打开影像数据
    driver = gdal.GetDriverByName('GTiff')
    # 创建输出的数据驱动
    driver.CreateCopy(path_out_image, ds, strict=1, callback=Show_Progress,
                      options=["TILED=YES", "COMPRESS=PACKBITS", "BIGTIFF=YES"])
    # 设置压缩参数
    """
    PACKBITS:连续字节压缩,快速无损压缩
    LZW:所有信息全部保留(可逆),以某一数值代替字符串,快速无损压缩
    """
    del ds


def Get_Size(path_file):
    """
    :param path_file: 需要压缩影像的路径
    :return: 返回占用多少M
    """
    size = os.path.getsize(path_file)
    size = size / float(1024 * 1024)
    return round(size, 2)


if __name__ == "__main__":
    path_input = "B:\sharpening1"
    path_output = "B:\sharpening1.tif"
    print("开始压缩......")
    Image_Compress(path_input, path_output)
    print("压缩已完成......")
    print("压缩前:%sMB" % Get_Size(path_input))
    print("压缩后:%sMB" % Get_Size(path_output))

        遥感影像的压缩其实还是非常重要的,当然重中之重肯定还是无损!压缩。同样,对于高光谱数据的降维其实也是为了提高工作效率,减少数据的冗余。所以多学多看吧,任重道远!

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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
要在Python中使用GDAL库进行遥感影像配准,您可以使用以下代码示例: ```python from osgeo import gdal def image_registration(input_image_path, reference_image_path, output_image_path): # 打开需要配准的影像 src_ds = gdal.Open(input_image_path) # 打开参考影像 ref_ds = gdal.Open(reference_image_path) # 获取需要配准影像的地理转换信息 src_geo_transform = src_ds.GetGeoTransform() # 获取参考影像的地理转换信息 ref_geo_transform = ref_ds.GetGeoTransform() # 创建一个空的输出影像,用于存储配准结果 out_ds = gdal.GetDriverByName('GTiff').Create(output_image_path, src_ds.RasterXSize, src_ds.RasterYSize, src_ds.RasterCount, src_ds.GetRasterBand(1).DataType) # 设置输出影像的地理转换信息为参考影像的地理转换信息 out_ds.SetGeoTransform(ref_geo_transform) # 设置输出影像的投影信息为参考影像的投影信息 out_ds.SetProjection(ref_ds.GetProjection()) # 进行影像配准 gdal.ReprojectImage(src_ds, out_ds, src_ds.GetProjection(), ref_ds.GetProjection(), gdal.GRA_NearestNeighbour) # 关闭数据集 src_ds = None ref_ds = None out_ds = None # 调用函数进行影像配准 input_image_path = 'input_image.tif' reference_image_path = 'reference_image.tif' output_image_path = 'output_image.tif' image_registration(input_image_path, reference_image_path, output_image_path) ``` 请确保将`input_image.tif`替换为需要配准的影像路径,`reference_image.tif`替换为参考影像路径,`output_image.tif`替换为输出影像路径。 这个示例代码中的`image_registration`函数接受三个参数,分别是需要配准的影像路径、参考影像路径和输出影像路径。函数会打开需要配准的影像和参考影像,并根据参考影像的地理转换信息和投影信息创建一个空的输出影像。然后使用最近邻插值方法进行影像配准,最后关闭数据集。 希望这能对您有所帮助!如果您还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RS迷途小书童

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值