首页 学习区

今天需要将一批3波段的.tiff图像批量转移为.jpeg的格式,最终使用 python + gdal_translate 解决了问题。

尝试PIL——失败

原始使用的代码如下,参考了网上的解决方法,发现对于图像太大的遥感影像来说,网上的解决方法并不可行,会报出无法识别图像格式的错。

import os
from PIL import Image

def main():
    tiff_dir = "E:/MSIL1C-Dianchi/postprocessing/MSI_TrueColor3"
    jpg_dir = "E:/MSIL1C-Dianchi/postprocessing/MSI_JPG"
    for tif_name in os.listdir(tiff_dir):
        tif_path = os.path.join(tiff_dir, tif_name)
        img = Image.Open(tif_path)
        jpg_path = os.path.join(jpg_dir, tif_name[:-5]+'.jpg')
        img.save(jpg_path)

image

尝试gdal_translate——成功

既然常规处理图像的方法行不通,那就想到了处理遥感影像的当家方法:gdal_translate

一开始使用时,报出了 JPEG 不支持32位浮点数数据格式的错误,可以看到,所生成的图像都是失真的。这时所使用的语句是:

subprocess.call(["gdal_translate", "-of", "JPEG", tif_path, jpg_path])

image (1)

为了修复这个错误,让图像正常显示,经我查找,需要额外添加这些参数:

"-b", "1", "-b", "2", "-b", "3", "-ot", "byte", "scale", "0", "4000"

-b的含义是选择一个输入的波段以用于输出。这里需要依次选择全部的三个波段才可以正常显示图片。

-ot的含义是使图像强制输出驱动支持的特定数据类型。因为JPEG只支持byte,所以在这里把数据类型也设置为byte

-scale的含义是缩放。当仅写了-scale时,说明会把输入范围缩放到0 至 255 的输出范围。如果只采用默认的话,那么图像的颜色会很暗淡。我这里把它的色彩取值设为了0~4000,颜色瞬间就鲜艳了许多。

代码如下:

import os
import subprocess

def main():
    tiff_dir = "E:\\MSIL1C-Dianchi\\postprocessing\\MSI_TrueColor3"
    jpg_dir = "E:\\MSIL1C-Dianchi\\postprocessing\\MSI_JPG"
    for tif_name in os.listdir(tiff_dir):
        tif_path = os.path.join(tiff_dir, tif_name)
        jpg_path = os.path.join(jpg_dir, tif_name[:-16]+'.jpeg')
        subprocess.call(["gdal_translate", "-b", "1", "-b", "2", "-b", "3", "-ot", "byte", 
                         "-of", "JPEG","-scale", "0", "4000", tif_path, jpg_path])

运行结果

image-20210722151203200

参考

https://gdal.org/programs/gdal_translate.html

https://gis.stackexchange.com/questions/143584/convert-a-tiff-float32-image-to-8bit-tif-or-jpeg-image-using-gdal-and-python




文章评论

目录