赞
踩
CIA和LGC数据是做数据融合的实验数据,一个是modis,一个是landsat,以下是根据不同数据做的python程序,我也是经常在网上参考大家的代码,包括以下的代码,也是参考了网上的信息,希望能给大家带来一点帮助,祝大家学习快乐!
以下是LGC_int转tif的程序
- # -*- coding: utf-8 -*-
- """
- Created on Thu Sep 28 14:47:13 2023
- @author: Administrator
- """
-
- # -*- coding: utf-8 -*-
- import numpy as np
- from osgeo import gdal
- import os
-
-
- # 依据BSQ存储规则,按照存储完单波段整幅图像后再存储下一波段的存储方法进行提取并存入数组。
- def read_as_bsq(dataarr,bands, rows, col):
- imgarr = np.zeros((bands,rows,col))
- for b in range(bands): #取出每个波段
- start = b * rows * col
- end = start + rows * col
- arrtem = dataarr[start:end]
- for r in range(rows): #一维数组按行取出,存入对应三维数组。
- start2 = r * col
- end2 = start2 + col
- imgarr[b,r,:] = arrtem[start2:end2]
- return imgarr
-
- def test_writetotif(dir):
- #读取二进制数据并转换成int16类型的数组
- #dir = r"J:\G\workk\2023\zy\LGC\MODIS\MOD09GA_A2004107.sur_refl.int"
- f = open(dir, 'rb')
- fint = np.fromfile(f,dtype = np.int16)
-
- #数据提取
- bands, rows, col =6, 2720,3200
- #imgarr = read_as_bil(fint, bands, rows, col)
- imgarr = read_as_bsq(fint, bands, rows, col)
- #imgarr = read_as_bip(fint, bands, rows, col)
- #将提取的数组存储为tif格式图像.
- #注意这里未设置地理坐标和仿射变换信息,所以不能用ENVI等软件打开。
- savedir=dir.split(".")[0]+"_sur_refl_new.tif"
- #savedir = r"E:\datasets\stfdatasets\Coleambally_Irrigation_Area\CIA\MODIS\2001_281_08oct\MOD09GA_A2001281.sur_refl.tif"
- datatype = gdal.GDT_UInt16
- bands, high, width = imgarr.shape
- driver = gdal.GetDriverByName("GTiff")
- datas = driver.Create(savedir, col, rows, bands, datatype)
-
- #设置地理坐标和仿射变换信息
- """
- image_geotrans=[378000,25,0,6170000,0,25]
- image_projection="AMG55"
- datas.SetGeoTransform(image_geotrans)
- datas.SetProjection(image_projection)"""
- for i in range(bands):
- datas.GetRasterBand(i + 1).WriteArray(imgarr[i])
- del datas
-
-
- if __name__ =="__main__":
- in_dir = r'J:\G\workk\2023\zy\LGC\MODIS' # input dir
-
- file_list = os.listdir(in_dir)
- for file in file_list:
- if file.endswith('.int'):
- test_writetotif(in_dir+"\\"+file)
- print("save succfully")
以下是CIA_bil格式转tif
- """
- Created on Thu Sep 28 14:47:13 2023
- @author: Administrator
- """
-
- # -*- coding: utf-8 -*-
- import numpy as np
- from osgeo import gdal
- import os
- from pyproj import Proj,transform
- from osgeo import osr
-
-
- # 依据BSQ存储规则,按照存储完单波段整幅图像后再存储下一波段的存储方法进行提取并存入数组。
- def read_as_bsq(dataarr,bands, rows, col):
- imgarr = np.zeros((bands,rows,col))
- for b in range(bands): #取出每个波段
- start = b * rows * col
- end = start + rows * col
- arrtem = dataarr[start:end]
- for r in range(rows): #一维数组按行取出,存入对应三维数组。
- start2 = r * col
- end2 = start2 + col
- imgarr[b,r,:] = arrtem[start2:end2]
- return imgarr
-
- def ReadBilFile(bil):
-
- gdal.GetDriverByName('EHdr').Register()
- img = gdal.Open(bil)
- band = img.GetRasterBand(1)
- data = band.ReadAsArray()
- return data
- # 依据BIP存储规则,按照一个像素所有波段进行存储完,再存储下一个像素所有波段的存储方法进行提取并存入数组。
- def read_as_bip(dataarr,bands, rows, col):
- imgarr = np.zeros((bands,rows,col))
- for r in range(rows): #按行列遍历每个像元
- for c in range(col):
- if r == 0 :
- pix = c
- else:
- pix = r * col + c
- start = pix * bands
- end = start + bands
- arrtem = dataarr[start:end] #从一维数组中取出每个像元的全波段元素(6个)
- for b in range(bands):
- imgarr[b,r,c] = arrtem[b] # 赋值给对应数组
- return imgarr
- # 依据BIL存储规则,按照存储完一行的所有波段再存储下一行,进行提取并存入数组。
- def read_as_bil(dataarr,bands, rows, col):
- imgarr = np.zeros((bands,rows,col))
- for r in range(rows): #取出一行的所有波段
- start = r * col * bands
- end = start + col * bands
- arrtem = dataarr[start:end]
- for b in range(bands): #取出每个波段
- start2 = b * col
- end2 = start2 + col
- imgarr[b,r,:] = arrtem[start2:end2] #存入数组对应位置
- return imgarr
- def test_writetotif(dir):
- #读取二进制数据并转换成int16类型的数组
- #dir = r"J:\G\workk\2023\zy\LGC\MODIS\MOD09GA_A2004107.sur_refl.int"
- f = open(dir, 'rb')
- fint = np.fromfile(f,dtype = np.int16)
-
- #数据提取
- bands, rows, col =6, 2040, 1720
- imgarr = read_as_bil(fint, bands, rows, col)
- #imgarr = read_as_bsq(fint, bands, rows, col)
- #imgarr = read_as_bip(fint, bands, rows, col)
- #将提取的数组存储为tif格式图像.
- #注意这里未设置地理坐标和仿射变换信息,所以不能用ENVI等软件打开。
- savedir=dir.split(".")[0]+"_sur_refl.tif"
- #savedir = r"E:\datasets\stfdatasets\Coleambally_Irrigation_Area\CIA\MODIS\2001_281_08oct\MOD09GA_A2001281.sur_refl.tif"
- datatype = gdal.GDT_UInt16
- bands, high, width = imgarr.shape
- driver = gdal.GetDriverByName("GTiff")
- datas = driver.Create(savedir, col, rows, bands, datatype)
-
- #设置地理坐标和仿射变换信息
- image_geotrans=[378000,25,0,6170000,0,25]
- #image_projection="20255"
- #image_projection="agd66"
- #agd66 = Proj(init='EPSG:20255')
- #p = Proj(init="EPSG:32650")
- datas.SetGeoTransform(image_geotrans)
- #datas.SetProjection(agd66)
- outRasterSRS = osr.SpatialReference()
- outRasterSRS.ImportFromEPSG(20255)
- datas.SetProjection(outRasterSRS.ExportToWkt())
- for i in range(bands):
- datas.GetRasterBand(i + 1).WriteArray(imgarr[i])
- del datas
-
-
- if __name__ =="__main__":
- in_dir = r'J:\G\workk\2023\zy\CIA\Landsat-init' # input dir
-
- file_list = os.listdir(in_dir)
- for file in file_list:
- if file.endswith('.bil'):
- test_writetotif(in_dir+"\\"+file)
- print("save succfully")
以下是CIA int格式转tif
- """
- Created on Thu Sep 28 14:47:13 2023
- @author: Administrator
- """
-
- # -*- coding: utf-8 -*-
- import numpy as np
- from osgeo import gdal
- import os
- from osgeo import osr
-
- # 依据BSQ存储规则,按照存储完单波段整幅图像后再存储下一波段的存储方法进行提取并存入数组。
- def read_as_bsq(dataarr,bands, rows, col):
- imgarr = np.zeros((bands,rows,col))
- for b in range(bands): #取出每个波段
- start = b * rows * col
- end = start + rows * col
- arrtem = dataarr[start:end]
- for r in range(rows): #一维数组按行取出,存入对应三维数组。
- start2 = r * col
- end2 = start2 + col
- imgarr[b,r,:] = arrtem[start2:end2]
- return imgarr
-
- def test_writetotif(dir):
- #读取二进制数据并转换成int16类型的数组
- #dir = r"J:\G\workk\2023\zy\LGC\MODIS\MOD09GA_A2004107.sur_refl.int"
- f = open(dir, 'rb')
- fint = np.fromfile(f,dtype = np.int16)
-
- #数据提取
- bands, rows, col =6, 2040, 1720
- #imgarr = read_as_bil(fint, bands, rows, col)
- imgarr = read_as_bsq(fint, bands, rows, col)
- #imgarr = read_as_bip(fint, bands, rows, col)
- #将提取的数组存储为tif格式图像.
- #注意这里未设置地理坐标和仿射变换信息,所以不能用ENVI等软件打开。
- savedir=dir.split(".")[0]+"_sur_refl.tif"
- #savedir = r"E:\datasets\stfdatasets\Coleambally_Irrigation_Area\CIA\MODIS\2001_281_08oct\MOD09GA_A2001281.sur_refl.tif"
- datatype = gdal.GDT_UInt16
- bands, high, width = imgarr.shape
- driver = gdal.GetDriverByName("GTiff")
- datas = driver.Create(savedir, col, rows, bands, datatype)
-
- #设置地理坐标和仿射变换信息
- image_geotrans=[378000,25,0,6170000,0,25]
- image_projection="AMG55"
- datas.SetGeoTransform(image_geotrans)
-
- #datas.SetProjection(agd66)
- outRasterSRS = osr.SpatialReference()
- outRasterSRS.ImportFromEPSG(20255)
- datas.SetProjection(outRasterSRS.ExportToWkt())
- for i in range(bands):
- datas.GetRasterBand(i + 1).WriteArray(imgarr[i])
- del datas
-
-
- if __name__ =="__main__":
- in_dir = r'J:\G\workk\2023\zy\CIA\MODIS-init' # input dir
-
- file_list = os.listdir(in_dir)
- for file in file_list:
- if file.endswith('.int'):
- test_writetotif(in_dir+"\\"+file)
- print("save succfully")
以下是多波段tif数据选择rgb波段然后显示的程序
- """
- Created on Sun Oct 8 15:09:42 2023
- @author: Administrator
- """
- import numpy as np
- import tifffile as tf #tifffile是tiff文件的读取库
- from PIL import Image
- import cv2 as cv
-
- from osgeo import gdal
- import matplotlib.pyplot as plt
- #以下为三种拉伸方式,如果不拉伸,图像太黑,拉伸完显示的图像更好看
- def optimized_linear(arr):
- a, b = np.percentile(arr, (2.5, 99))
- c = a - 0.1 * (b - a)
- d = b + 0.5 * (b - a)
- arr = (arr - c) / (d - c) * 255
- arr = np.clip(arr, 0, 255)
- return np.uint8(arr)
- def percent_linear(arr, percent=2):
- arr_min, arr_max = np.percentile(arr, (percent, 100-percent))
- arr = (arr - arr_min) / (arr_max - arr_min) * 255
- arr = np.clip(arr, 0, 255)
- return np.uint8(arr)
- def linear(arr):
- arr_min, arr_max = arr.min(), arr.max()
- arr = (arr - arr_min) / (arr_max - arr_min) * 255
- arr = np.clip(arr, 0, 255)
- return np.uint8(arr)
- path=r"J:\G\workk\2023\zy\LGC\MODIS\MOD09GA_A2004235_sur_refl.tif"
- data = gdal.Open(path) # 读取tif文件
- num_bands = data.RasterCount # 获取波段数
- print(num_bands)
- tmp_img = data.ReadAsArray() #将数据转为数组
- print(tmp_img.shape)
- img_rgb = tmp_img.transpose(1, 2, 0) #由波段、行、列——>行、列、波段
-
- img_rgb = np.array(img_rgb, dtype=np.uint16) #设置数据类型,np.unit8可修改
- #img_rgb = np.array(img_rgb)
- r = img_rgb[:, :,3]
- g = img_rgb[:, :,2]
- b =img_rgb[:, :,1]
-
- img_rgb = np.dstack((percent_linear(r), percent_linear(g),percent_linear(b))) # 波段组合
-
- #img_rgb = np.array(img_rgb, dtype=np.uint8)
-
- # plt.imshow(img_rgb)
- # plt.show()
- # 通过调用plt.axis(“ off”),可以删除编号的轴
- plt.figure(dpi=800)
- plt.axis("off")
- plt.imshow(img_rgb)
- plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。