今天需要将一批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)
尝试gdal_translate——成功
既然常规处理图像的方法行不通,那就想到了处理遥感影像的当家方法:gdal_translate
。
一开始使用时,报出了 JPEG 不支持32位浮点数数据格式的错误,可以看到,所生成的图像都是失真的。这时所使用的语句是:
subprocess.call(["gdal_translate", "-of", "JPEG", tif_path, jpg_path])
为了修复这个错误,让图像正常显示,经我查找,需要额外添加这些参数:
"-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])
www.yingshi.tv