这里简单的介绍下什么是图像金字塔,以及在GIS系统下创建图像金字塔的作用。
首先,图像金字塔是由一副图像生成得到的一系列分辨率逐渐降低的图像组成的集合。其构成方式类似于金字塔的形状,在最底层是最高分辨率的原始图像,逐渐向上,是依照特定的采样方法得到的低分辨率图像。其大致构造如下图:
我们都知道,读取一副大的图片乃至大范围的多幅遥感影像时,如果对图片进行操作,诸如:放大,缩小,移动等,图片的刷新会有一定的延迟。但是,需要注意的是,在进行浏览全局的时候,实际并不需要最高分辨率的图像。此时,创建了金字塔的图像,在进行大范围的浏览时,会自动读取低分辨率的图像,而当我们进行放大,对细节进行观察时,则会根据不同的缩放比例读取对应分辨率的金字塔文件,从而使得影像的浏览变得更加流畅。
图像金字塔文件的格式主要有:rrd(reduced resolution dataset)格式和ovr格式。
首先,rrd文件是针对ERDAS IMAGING文件而创建的,而在旧版的ArcGIS中创建的tif等文件的金字塔也是rrd格式。
ovr 格式是最新的金字塔文件格式,并且其可以控制压缩类型和金字塔的质量。
常见的创建金字塔的采样方法有:最近邻,高斯,均值等。
有的时候,创建金字塔的过程还会得到aux.xml文件,该文件用于存储无法在栅格文件本身存储的任何辅助信息。
辅助文件可存储以下内容:
1. 色彩映射表
2. 统计数据、直方图或表
3. 金字塔文件的指针
4. 坐标系
5. 变换
6. 投影信息
QGIS下图像金字塔的创建其实也还是调用的GDAL库,所以,本处所使用的代码,其实直接在GDAL下也可以使用。
首先介绍GDAL下创建金字塔的主要两个函数:
首先介绍下gdaladdo 的帮助文档:
Usage: gdaladdo [-r {nearest,average,gauss,cubic,cubicspline,lanczos,average_mp,average_magphase,mode}]
[-ro] [-clean] [-q] [-oo NAME=VALUE]* [-minsize val]
[–help-general] filename [levels]
解释:此处可以看见gdaladdo可以设置的参数
Useful configuration variables :
解释:此处是gdalddo可以选择的金字塔生成格式和压缩方式等信息
from qgis.core import *
import os
from subprocess import call
# define gdaladdo(找到你自己文件夹中对应的gdaladdo)
gdal_ad = r"C:\OSGeo4W64\bin\gdaladdo.exe"
def build_pyramids_gdaladdo(file_name):
"""
:param file_name: 需要建立金字塔文件的输入文件
:return:
"""
call([gdal_ad, '-r', 'NEAREST', '-ro', '--config', 'COMPRESS_OVERVIEW', 'DEFLATE', file_name, '2 4 6 8 32 64'])
if __name__ == '__main__':
# QGIS的配置
QgsApplication.setPrefixPath(r"C:\OSGeo4W64", True)
qgs = QgsApplication([], True)
qgs.initQgis()
# 给定存储数据的目录,并进行金字塔的建立
file_folder = str
for file in os.listdir(file_folder):
if file[-3:] == 'tif':
filename = file_folder + "/" + file
build_pyramids_gdaladdo(filename)
qgs.exitQgis()
从代码运行情况可以看见金字塔成功创建:
然后在对应目录下,也能看见金字塔文件已经生成:
根据自己的需要,可以对
call([gdal_ad, ‘-r’, ‘NEAREST’, ‘-ro’, ‘–config’, ‘COMPRESS_OVERVIEW’, ‘DEFLATE’, file_name, ‘2 4 6 8 32 64’])
语句进行修改。
from qgis.core import *
import os
from subprocess import call
# define gdaladdo
gdal_ad = r"C:\OSGeo4W64\bin\gdaladdo.exe"
def clean_pyramids_gdaladdo(file_name):
"""
:param file_name: 需要删除金字塔文件的输入文件
:return:
"""
call([gdal_ad, '-clean', file_name])
if __name__ == '__main__':
# 进行QGIS的配置
QgsApplication.setPrefixPath(r"C:\OSGeo4W64", True)
qgs = QgsApplication([], True)
qgs.initQgis()
# 给定存储数据的目录,进行金字塔的清除
file_folder = str
for file in os.listdir(file_folder):
if file[-3:] == 'tif':
filename = file_folder + "/" + file
clean_pyramids_gdaladdo(filename)
qgs.exitQgis()
然后就可以看见对应目录下的金字塔文件全被删除。
BuildOverViews 函数的参数设置和gdaladdo基本相同,所以下面仅给出一段代码作为简单的例子。
from qgis.core import *
import os
def build_pyramids_overviews(file_name):
"""
:return:
"""
image = gdal.Open(file_name, 0)
# 如果第二个参数设置为0,则金字塔文件建立在外面
# 如果第二个参数缺省或者为1,则金字塔文件建立在文件内
gdal.SetConfigOption('COMPRESS_OVERVIEW', 'DEFLATE')
ov_list = [2, 4, 6, 8, 16, 32, 64]
image.BuildOverviews("NEAREST", overviewlist=ov_list)
del image
if __name__ == '__main__':
# 进行QGIS的初始化配置
QgsApplication.setPrefixPath(r"C:\OSGeo4W64", True)
qgs = QgsApplication([], True)
qgs.initQgis()
# 给定存储数据的目录,并进行金字塔的创建
file_folder = str
for file in os.listdir(file_folder):
if file[-3:] == 'tif':
filename = file_folder + "/" + file
build_pyramids_overviews(filename)
qgs.exitQgis()