GIS 和 RS 处理(一)——随缘记

#将 16 bit 的数据写成 8 bit 数据
#2021-08-07
#tif2-jpg
#version1/0

# from osgeo import gdal
import os
import imageio

#initialize 
Working_dir = './move_dir'
New_dir = './png_files'
files = os.listdir(Working_dir)

def Tif2Png(Working_dir,New_dir):
    files = os.listdir(Working_dir)
    #loop
    for i in range(len(files)):
        #get the filename from list
        file_name = files.pop()
        #Raster = gdal.Open(True_file_name)
        #Array = Raster.ReadAsArray(xsize=512,ysize=512)
        True_file_name = os.path.join(Working_dir,file_name)
        image = imageio.imread(True_file_name)
        image = image.astype('uint8')
        #Write the files
        Out_filename = os.path.join(New_dir,file_name)
        imageio.imwrite(Out_filename,image)
    print('Finish the processing')
            

if __name__ == "__main__":
    #Main_pro
    Tif2Png(Working_dir,New_dir)
    

批量将 tif 文件由 16 bit 转为 8bit,并且写出

  由于遥感影像或者 OSM 的矢量转出后大多为 16 bit 的数据,而 DL training 的时候需要用 png 或者 jpg 图片,并且由于 training 的时候坐标系丢失,后续自动给影像加上投影坐标系即可,所以可以直接用 imageio 模块读入 tif 然后写出 png ,然后用 imageio.astype('uint8')强行转化,当然这在 DL 会导致一些遥感影像的多光谱数据或者高光谱的信息损失。原始的 tif 图是有坐标系的,而写出后坐标系丢失,当然,可以使用 gdal 模块去写出 tif,没必要,DL 只需要光谱信息去做信息。

GIS 和 RS 处理(一)——随缘记_第1张图片

GIS 和 RS 处理(一)——随缘记_第2张图片

  前期在处理数据的时候主要是矢量转栅格,但是矢量转栅格的过程中,需要将地理处理选项中的后台处理给关掉,否则转的特别慢,同时采样的大小需要自定义分辨率,如果分辨率太高,会导致数据量特别大,需要分幅裁剪之后然后再导出 tif,然后再出 png 的图,矢量转栅格,裁剪,可以用 ArcGIS,也可以用 ENVI,ENVI,如果 label 需要 mask 可以用 ENVI 的 band math 做计算,即所谓的逻辑计算,在普通的照片查看器中看到的是一片黑,而在 GIS 或者 ENVI 中查看 tif 才能看到上面的选项。
plus: ENVI 处理数据的时候,在 band math 中把 nodata 设置为 0 看待,如果用 ArcGIS 裁剪的话,会出现 nodata,当然,ArcGIS裁剪的方法多种多样。像这次处理的数据有 23 个 G,用 python 的 gdal 库读取裁剪,是无法加载的,只能先选择一小部分,然后再加载进去,加载完成后用知乎中某位大神的裁剪方法,设置重复率裁剪即可,然后需要用代码检查是否由于建筑物样本太少而变成全 0 的情况,如果用 Arcgis 检查,或者普通的照片查看器看会很麻烦,所以可以用 gdal 库查看,通过 np.sum(array ==1) 的方法查看 1 值的个数,然后把它移动到新的文件夹中,主要是使用 os,shutil,gdal模块,代码就随缘贴吧,好多事情…

GIS 和 RS 处理(一)——随缘记_第3张图片

#将像元素大于 4000 的给移动到新的文件夹之中
#author:Neverland!
#data:2021-08-06
#version1.0
from osgeo  import gdal
import os
import numpy as np 
import shutil 

# initialize
list_dir = './samples/'
dir = os.listdir(list_dir)
new_dir = './move_dir/'
#rename_index
index = 0 


# def read_raster():
#     try:
for i in range(len(dir)):
    files = dir.pop()
    filename = os.path.join(list_dir,files)
    Raster = gdal.Open(filename)
    #正确打开影影像
    Array = Raster.ReadAsArray(xsize=512,ysize=512)
    #判断建筑的个数
    if (np.sum(Array ==1))>4000:
            index += 1 
            new_aftname = str(index) + '.tif'
        #需要销毁内存,否则会报正在占用内存的错
            Raster = None
        #新文件夹的路径并移动
            new_path = os.path.join(new_dir,files)
            shutil.move(filename,new_path) 
            print(new_path,'已经成功移进新文件夹')
            old_name = os.path.join(new_dir,files)
            print('新文件的路径为' + new_path)
            new_name = os.path.join(new_dir,new_aftname)
            os.rename(old_name,new_name)
            print('已成功将文件名由' + files + '改为' + new_aftname )

  原来 list.pop() 是从尾到头pop 出元素,文件名是乱序的,而现在像素个数>4000的已经顺序。查看 tif 已经全部被移出来并且由原来的命名为按顺序的 tif
GIS 和 RS 处理(一)——随缘记_第4张图片

你可能感兴趣的:(GIS 和 RS 处理(一)——随缘记)