最近AI+环境论文需要收集各种类型的GIS格式,尝试对收集到的tiff文件格式数据进行处理,试图将其转成自己想要的excel格式数据方便之后进一步的深度学习处理。
Tiff格式介绍
tiff 是一种存储多维数据的无损图像格式,属于位图格式,全名是Tag Image File Format
。
Tiff格式优点:
- TIFF格式允许在单个文件中存储多个图像,每个图像可以是单独的页面。这使得TIFF在文档扫描和传真等领域非常有用。
- TIFF文件可以包含丰富的元数据信息,如图像的分辨率、色彩配置、作者信息等。
- 由于TIFF是一种广泛支持的格式,几乎所有的图像编辑软件和操作系统都能够读取和写入TIFF文件。
- TIFF 格式支持更高维度的图像,比如带有深度信息的三维体素数据(通常在科学和医学图像处理中使用),或者多页 TIFF,其中每一页可以被视为一个额外的维度。这使得 TIFF 可以存储序列图像(例如扫描的文档的各个页面)或者帧序列(例如动画或视频的各个帧)。
Tiff格式读取及处理
使用python 读取 tiff文件
python 读取tiff 文件需要下载gdal库文件,可以在github网站下载(但我没找到whl文件的下载地址),使用conda下载gdal成功了。
复习一些知识方便对tiff图像进行裁剪,减少运算时间(我也是发现代码一直运行不成功才想到应该减少一些不必要的计算,建议对着图片筛选自己需要的地方)
>>> range(10) # 从 0 开始到 9
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11) # 从 1 开始到 10
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
参考了其他博主的代码 仅仅作为笔记
# coding UTF-8
from osgeo import gdal
from pylab import * # 支持中文
mpl.rcParams['font.sans-serif'] = ['SimHei']
from openpyxl import Workbook
# 创建一个Workbook对象
work = Workbook()
def out(data, name):
ws = work.active
ws['A1'] = '经度'
ws['B1'] = '纬度'
ws['C1'] = '高程'
ws['D1'] = '所在栅格行'
ws['E1'] = '所在栅格列'
for i in range(len(data)):
rows = []
row_length = len(data[i])
if row_length != 0:
for j in range(row_length):
rows.append(data[i][j])
ws.append(rows[j])
print(rows)
work.save(name)
if __name__ == "__main__":
filePath = 'K:/GLC_FCS30_2020_E120N35.tif' # tif文件路径
dataset = gdal.Open(filePath) # 打开tif
# 获取行数列数和地理信息
# geo_information(0):左上像素左上角的x坐标。
# geo_information(1):w - e像素分辨率 / 像素宽度。
# geo_information(2):行旋转(通常为零)。
# geo_information(3):左上像素左上角的y坐标。
# geo_information(4):列旋转(通常为零)。
# geo_information(5):n - s像素分辨率 / 像素高度(北半球上图像为负值)
geo_information = dataset.GetGeoTransform()
col = dataset.RasterXSize
row = dataset.RasterYSize #18554
band = dataset.RasterCount
dem = dataset.GetRasterBand(1).ReadAsArray()
# 获取行列数,对应其经纬度,j对于x坐标
cols = []
for y in range(11590,14388): # 行
rows = []
for x in range(4278,7846): # 列
# 有效高程
if dem[y][x] > 0:
# 输出经纬度
# 具体计算还需要您多思考一下 是加是减 对应着自己的tiff图像多看看再修改一下
lon = geo_information[0] + x * geo_information[1] + y * geo_information[2]
lat = geo_information[3] + x * geo_information[4] + y * geo_information[5]
child = [lon, lat, dem[y][x], y, x]
rows.append(child)
cols.append(rows)
out(cols, 'GLC_FCS30_2020_E120N35.xlsx')
print('表已经生成')
上面介绍的转换公式应该很好理解,也是tiff文件中会携带的像素和位置信息。
ModelTiepointTag
matlab 读取 tiff文件 常用命令
此 MATLAB 函数返回一个结构体,该结构体的字段包含有关图形文件 filename 中的图像的信息。
info = imfinfo(filename)
info = imfinfo(filename,fmt)
熟悉matlab操作的朋友可以试试用matlab来进行处理
ModelTiepointTag
Arcgis 读取 tiff 文件 常用命令
但我感觉arcgis读取的文件依旧需要自己自行进行转换成excel格式,于是没有研究