import os import glob import numpy as np import struct from PIL import Image from tool.algorithm.ml.machineLearning import MachineLeaning as ml def read_bin_to_img(bin_path): """ 读取bin格式二进制数据,输出为矩阵 :param bin_path : bin文件的路径,包含.bin,.config :return : 矩阵信息 """ (bin_dir, bin_name) = os.path.split(bin_path) config_path = os.path.join(bin_dir, 'config.txt') config = open(config_path, 'r').read().split('\n', -1) rows = int(config[1]) cols = int(config[4]) bin_file = open(bin_path, 'rb') # 打开二进制文件 size = os.path.getsize(bin_path) # 获得文件大小 if size < rows * cols * 4: raise Exception( 'bin size less than rows*cols*4! size:', size, 'byte, rows:', rows, 'cols:', cols) img = np.zeros([rows, cols], dtype=np.float32) for row in range(rows): data = bin_file.read(4 * cols) # 每次读取一行的二进制数据 row_data = struct.unpack('f' * cols, data) # 转为一行float数据 img[row, :] = row_data bin_file.close() return img def write_bin_to_tif(out_tif_dir, bin_dir): """ 读取H-A-Alpha分解二进制数据,输出为矩阵格式的字典 :param out_tif_dir : tif的输出路径 :param bin_dir : 二进制数据的目录,包含.bin,.config :return out_tif_path: 生成tif的路径字典 """ bin_paths = list(glob.glob(os.path.join(bin_dir, '*.bin'))) out_tif_path = {} for in_path in bin_paths: name = os.path.split(in_path)[1].split('.')[0] out_path = os.path.join(out_tif_dir, name + '.tif') out_tif_path.update({name: out_path}) if os.path.exists(os.path.split(out_path)[0]) is False: os.makedirs(os.path.split(out_path)[0]) img_array = read_bin_to_img(in_path) img_array[np.isnan(img_array)] = 0 # 异常值填充为0 img_array = ml.standardization(img_array) # 数据标准化到[0,1] out_image = Image.fromarray(img_array) out_image.save(out_path) return out_tif_path def write_bin_to_tif_soil(out_tif_dir, bin_dir): """ 读取H-A-Alpha分解二进制数据,输出为矩阵格式的字典 :param out_tif_dir : tif的输出路径 :param bin_dir : 二进制数据的目录,包含.bin,.config :return out_tif_path: 生成tif的路径字典 """ bin_paths = list(glob.glob(os.path.join(bin_dir, '*.bin'))) out_tif_path = {} for in_path in bin_paths: name = os.path.split(in_path)[1].split('.')[0] out_path = os.path.join(out_tif_dir, name + '.tif') out_tif_path.update({name: out_path}) if os.path.exists(os.path.split(out_path)[0]) is False: os.makedirs(os.path.split(out_path)[0]) img_array = read_bin_to_img(in_path) img_array[np.isnan(img_array)] = 0 # 异常值填充为0 # img_array = ml.standardization(img_array) # 数据标准化到[0,1] out_image = Image.fromarray(img_array) out_image.save(out_path) return out_tif_path if __name__ == '__main__': bin_dir = r'F:\TempData\oh2004' out_tif_dir = r'F:\TempData\oh2004tif' write_bin_to_tif_soil(out_tif_dir, bin_dir)