jp2格式读取并批量转为GeoTiff格式

「作者主页」:zy_destiny
「作者简介」:主要关注计算机视觉、语义分割、目标检测、遥感影像处理、变化检测等方向,正在努力成为CSDN优质创作者
「推荐专栏」:对变化检测感兴趣的小伙伴可以关注专栏“变化检测论文解读”

                         对GDAL感兴趣的小伙伴可以关注专栏——GDAL

                         对目标检测感兴趣的小伙伴可以关注专栏——变化检测论文解读

                         对语义分割感兴趣的小伙伴可以关注专栏——语义分割

                         对Transformer感兴趣的小伙伴可以关注专栏——Transformer

目录

jp2格式说明:

jp2格式读取方式一

jp2格式读取方式二

jp2格式转tif格式

批量jp2格式转tif格式


jp2格式说明:

jp2格式:  经过JPEG2000压缩算法压缩后的一种影像数据格式

GeoTiff格式:一种带地理坐标的以tif或tiff为后缀的一种影像数据格式

        对于jp2格式,如果不追求地理坐标,只读取像素值,可以使用opencv进行数据读取,如果要保留原始数据中的地理坐标,就需要gdal来进行读取了。 本文主要讲解如何通过gdal将jp2格式数据转换为tif格式。


jp2格式读取方式一

用opencv读取,不包含地理坐标,读取到的波段顺序为BGR

#用opencv读取,不包含地理坐标,读取到的波段顺序为BGR
import cv2 
img = cv2.imread(jp2_path,cv2.IMREAD_UNCHANGED)

jp2格式读取方式二

用gdal读取,能读取到地理坐标,读取到的array波段顺序为RGB

#用gdal读取,能读取到地理坐标,读取到的array波段顺序为RGB
from osgeo import gdal
dataset = gdal.Open(jp2_path)
img = dataset.ReadAsArray()

jp2格式转tif格式

函数参数说明:

  • gdal.GDT_Byte格式为uint8
  • gdal.GDT_UInt16为uint16
  • 数据均为单波段
  • jp2_path:jp2格式数据路径
  • save_file:tif格式数据路径
  • 设置nodata为0
#gdal.GDT_Byte格式为uint8,gdal.GDT_UInt16为uint16,数据均为单波段
#jp2_path:jp2格式数据路径
#save_file:tif格式数据路径

from osgeo import gdal
import numpy as np
def jp2Totif(jp2_path,save_path,file_name):
    file_name = os.path.splitext(file_name)[0]
    save_file = os.path.join(save_path,file_name)
    save_file = save_file+'.tif'
    dataset = gdal.Open(jp2_path)
    rows = dataset.RasterYSize
    cols = dataset.RasterXSize
    projection = dataset.GetProjection()
    trans = dataset.GetGeoTransform()
    data = dataset.ReadAsArray()
    if data.dtype == 'uint16':
        driver = gdal.GetDriverByName('GTiff')
        out_dataset = driver.Create(save_file, cols, rows, 1, gdal.GDT_UInt16)
        out_dataset.SetProjection(projection)
        out_dataset.SetGeoTransform(trans)
        out_dataset.GetRasterBand(1).WriteArray(data)
        out_dataset.GetRasterBand(1).SetNoDataValue(0)
        out_dataset.FlushCache()
        del dataset, out_dataset
    elif data.dtype == 'uint8':
        driver = gdal.GetDriverByName('GTiff')
        out_dataset = driver.Create(save_file, cols, rows, 1, gdal.GDT_Byte)
        out_dataset.SetProjection(projection)
        out_dataset.SetGeoTransform(trans)
        out_dataset.GetRasterBand(1).WriteArray(data)
        out_dataset.GetRasterBand(1).SetNoDataValue(0)
        out_dataset.FlushCache()
        del dataset, out_dataset

批量jp2格式转tif格式

函数参数说明:

  • input_dir:jp2格式数据输入文件夹地址
  • output_dir:tif格式数据保存文件夹地址
  • gdal.GDT_Byte格式为uint8
  • gdal.GDT_UInt16为uint16
  • 数据均为单波段
  • 设置nodata为0
from osgeo import gdal
import numpy as np

def jp2Totif(jp2_path,save_path,file_name):
    file_name = os.path.splitext(file_name)[0]
    save_file = os.path.join(save_path,file_name)
    save_file = save_file+'.tif'
    dataset = gdal.Open(jp2_path)
    rows = dataset.RasterYSize
    cols = dataset.RasterXSize
    projection = dataset.GetProjection()
    trans = dataset.GetGeoTransform()
    data = dataset.ReadAsArray()
    if data.dtype == 'uint16':
        driver = gdal.GetDriverByName('GTiff')
        out_dataset = driver.Create(save_file, cols, rows, 1, gdal.GDT_UInt16)
        out_dataset.SetProjection(projection)
        out_dataset.SetGeoTransform(trans)
        out_dataset.GetRasterBand(1).WriteArray(data)
        out_dataset.GetRasterBand(1).SetNoDataValue(0)
        out_dataset.FlushCache()
        del dataset, out_dataset
    elif data.dtype == 'uint8':
        driver = gdal.GetDriverByName('GTiff')
        out_dataset = driver.Create(save_file, cols, rows, 1, gdal.GDT_Byte)
        out_dataset.SetProjection(projection)
        out_dataset.SetGeoTransform(trans)
        out_dataset.GetRasterBand(1).WriteArray(data)
        out_dataset.GetRasterBand(1).SetNoDataValue(0)
        out_dataset.FlushCache()
        del dataset, out_dataset

if __name__ == "__main__":

    input_dir = r'jp2格式文件所在路径'
    output_dir = r'GeoTiff文件的保存路径'
    for filename in os.listdir(input_dir):
        if filename.endswith('jp2'):
            jp2Totif(os.path.join(input_dir, filename), output_dir , filename.split('.jp2')[0] )

整理不易,欢迎一键三连!!!

送你们一条美丽的--分割线--

⛵⛵⭐⭐

你可能感兴趣的:(python,opencv,人工智能,计算机视觉,gdal)