教程:批量将 .tif 文件转换为 .mat 文件
引言
在遥感图像处理、地理信息系统(GIS)等领域,.tif(Tagged Image File Format)是一种常用的文件格式,尤其适用于存储栅格数据。栅格数据是一种用来表示空间信息的方式,常用于遥感图像、地形模型等数据。
相比之下,在数据科学和机器学习领域,.mat(MATLAB 文件格式)则是一种非常流行的数据存储格式,特别适用于存储多维数组、矩阵等数据类型。
问题描述
你可能有一批 .tif 文件,这些文件可能包含卫星图像、地理信息数据或其他需要处理的栅格数据,但为了在 MATLAB 或 Python 中使用这些数据,你需要将它们转换为 .mat 格式。手动转换大量文件既费时又容易出错,因此我们需要编写一个 Python 脚本来自动完成这一任务。
解决方案
通过编写一个简单的 Python 脚本,我们可以自动将指定文件夹中的所有 .tif 文件转换为 .mat 文件。接下来我们会一步步解释这段代码的工作原理和实现方法。
提示: 完整代码文件请在公众号Python与遥感后台回复关键词“tifmat”自动获取。
所需的工具和库
在开始之前,你需要安装以下 Python 库:
os
: 这是 Python 的标准库之一,用于处理文件和目录。gdal
: 用于读取和处理栅格地理数据。numpy
: 一个强大的科学计算库,用于处理多维数组。scipy.io
: 其中的savemat
函数可以将数据保存为 .mat 格式。
如果你还没有安装这些库,可以使用以下命令进行安装:
pip install numpy scipy gdal
代码讲解
1. 导入必要的库
import os
from osgeo import gdal
import numpy as np
import scipy.io as sio
os
: 用于处理文件路径和目录。gdal
: 用于打开和读取 .tif 文件,GDAL 是一个强大的地理空间数据处理库。numpy
: 用于数组操作,是科学计算的基础库。scipy.io
: 用于将数据保存为 .mat 文件,MATLAB 用户最熟悉的格式。
2. get_img 函数
def get_img(dataset_img):
width = dataset_img.RasterXSize # 获取图像的列数
height = dataset_img.RasterYSize # 获取图像的行数
bands = dataset_img.RasterCount # 获取图像的波段数
print("行数为:", height)
print("列数为:", width)
print("波段数为:", bands)
# 将图像数据读取为一个 numpy 数组
img = dataset_img.ReadAsArray(0, 0, width, height)
# 转置数组,使得数据的顺序符合我们通常的格式(行,列,波段)
new_img = np.transpose(img, (1, 2, 0))
return new_img
RasterXSize
和RasterYSize
分别获取图像的列数和行数。RasterCount
获取图像的波段数,例如 RGB 图像通常有 3 个波段,而高光谱图像可能有几十甚至上百个波段。ReadAsArray
将图像数据读取为一个 NumPy 数组。np.transpose
函数用于调整数组的维度顺序,使其符合我们常用的格式(行、列、波段),这对于后续的处理非常重要。
3. tiftomat 函数
def tiftomat(input_folder, output_folder, name):
# 确保输出文件夹存在,不存在则创建
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 遍历输入文件夹中的所有文件
for file_name in os.listdir(input_folder):
if file_name.endswith('.tif'): # 检查文件是否是 .tif 格式
# 构建完整的输入文件路径
input_file = os.path.join(input_folder, file_name)
# 使用 get_img 函数读取图像数据
image = get_img(gdal.Open(input_file))
# 构建输出文件的路径,将 .tif 后缀替换为 .mat
output_file = os.path.join(output_folder, file_name.replace('.tif', '.mat'))
# 将图像数据保存为 .mat 文件
sio.savemat(output_file, {name: image})
tiftomat
函数用于遍历指定文件夹中的所有 .tif 文件,并将它们逐一转换为 .mat 文件。os.listdir(input_folder)
返回文件夹中所有文件的列表。通过if file_name.endswith('.tif')
检查文件是否为 .tif 格式。- 使用
os.path.join
构建输入和输出文件的完整路径。 sio.savemat
函数将图像数据保存为 .mat 文件。name
参数指定了保存到 .mat 文件中的变量名。
注意: name
是保存到 .mat 文件中的变量名。MATLAB 用户在加载 .mat 文件时会看到这个名字。如果你的 .mat 文件中有多个变量,这个名字能帮助你识别存储的内容。
4. 主程序
if __name__ == '__main__':
root = r'F:\datasets\TEST\540' # 数据文件夹的根路径
x_path = root + '\X' # .tif 文件所在的文件夹
out_x = root + '\X_mat' # .mat 文件输出的文件夹
tiftomat(x_path, out_x, name='hrhsi') # 执行转换
if __name__ == '__main__':
是 Python 的标准写法,确保代码仅在直接运行脚本时才会执行,而不是被其他模块导入时。root
是数据文件夹的根路径,你可以根据自己的文件存储位置进行修改。x_path
是存放 .tif 文件的文件夹路径。out_x
是用于保存 .mat 文件的输出文件夹路径。tiftomat
函数会遍历x_path
文件夹中的所有 .tif 文件,并将它们转换为 .mat 文件,保存到out_x
文件夹中。
运行脚本
保存代码为 tif_to_mat.py
文件,然后在命令行中运行该脚本:
python tif_to_mat.py
运行后,脚本将自动遍历指定文件夹中的所有 .tif 文件,并将它们转换为 .mat 文件,保存在输出文件夹中。
如何读取 .mat 文件
如果你想在 MATLAB 或 Python 中读取转换后的 .mat 文件,可以参考以下方法。
在 MATLAB 中读取
data = load('文件路径.mat');
disp(data.hrhsi); % 显示变量 'hrhsi' 的内容
在 Python 中读取
import scipy.io as sio
mat_data = sio.loadmat('文件路径.mat')
print(mat_data['hrhsi']) # 打印变量 'hrhsi' 的内容
总结
通过这篇教程,你学习了如何使用 Python 编写一个脚本,将 .tif 文件批量转换为 .mat 文件。这种自动化方法不仅节省了大量时间,还可以避免手动转换可能带来的错误。此外,我们还解释了 .tif 和 .mat 文件格式的基本知识,并提供了如何在 MATLAB 和 Python 中读取 .mat 文件的示例。希望你在学习的过程中有所收获,如果有任何问题,欢迎在评论区交流!