影象金字塔與QGIS下金字塔的建立
影象金字塔
這裡簡單的介紹下什麼是影象金字塔,以及在GIS系統下建立影象金字塔的作用。
什麼是影象金字塔
首先,影象金字塔是由一副影象生成得到的一系列解析度逐漸降低的影象組成的集合。其構成方式類似於金字塔的形狀,在最底層是最高解析度的原始影象,逐漸向上,是依照特定的取樣方法得到的低解析度影象。其大致構造如下圖:
GIS系統下建立影象金字塔的作用
我們都知道,讀取一副大的圖片乃至大範圍的多幅遙感影像時,如果對圖片進行操作,諸如:放大,縮小,移動等,圖片的重新整理會有一定的延遲。但是,需要注意的是,在進行瀏覽全域性的時候,實際並不需要最高解析度的影象。此時,建立了金字塔的影象,在進行大範圍的瀏覽時,會自動讀取低解析度的影象,而當我們進行放大,對細節進行觀察時,則會根據不同的縮放比例讀取對應解析度的金字塔檔案,從而使得影像的瀏覽變得更加流暢。
影象金字塔的檔案格式
影象金字塔檔案的格式主要有:rrd(reduced resolution dataset)格式和ovr格式。
rrd格式
首先,rrd檔案是針對ERDAS IMAGING檔案而建立的,而在舊版的ArcGIS中建立的tif等檔案的金字塔也是rrd格式。
ovr 格式
ovr 格式是最新的金字塔檔案格式,並且其可以控制壓縮型別和金字塔的質量。
建立影象金字塔的方法
常見的建立金字塔的取樣方法有:最近鄰,高斯,均值等。
注:
有的時候,建立金字塔的過程還會得到aux.xml檔案,該檔案用於儲存無法在柵格檔案本身儲存的任何輔助資訊。 輔助檔案可儲存以下內容: 1. 色彩對映表 2. 統計資料、直方圖或表 3. 金字塔檔案的指標 4. 座標系 5. 變換 6. 投影資訊
QGIS下影象金字塔的建立
QGIS下影象金字塔的建立其實也還是呼叫的GDAL庫,所以,本處所使用的程式碼,其實直接在GDAL下也可以使用。 首先介紹GDAL下建立金字塔的主要兩個函式:
- 第一個是gdaladdo
- 第二個是BuildOverviews。 注:這二者之間的區別和聯絡我也不是很清楚,但是其效果是一樣的,有人清楚的話歡迎在評論區回覆
gdaladdo
首先介紹下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可以設定的引數
- -r : choice of resampling method (default: nearest)
- -ro : open the dataset in read-only mode, in order to generate external overview (for GeoTIFF datasets especially)
- -clean : remove all overviews
- -q : turn off progress display
- -b : band to create overview (if not set overviews will be created for all bands)
- filename: The file to build overviews for (or whose overviews must be removed).
- levels: A list of integral overview levels to build. Ignored with -clean option.
Useful configuration variables : 解釋:此處是gdalddo可以選擇的金字塔生成格式和壓縮方式等資訊
- –config USE_RRD YES : Use Erdas Imagine format (.aux) as overview format. Below, only for external overviews in GeoTIFF format:
- –config COMPRESS_OVERVIEW {JPEG,LZW,PACKBITS,DEFLATE} : TIFF compression
- –config PHOTOMETRIC_OVERVIEW {RGB,YCBCR,…} : TIFF photometric interp.
- –config INTERLEAVE_OVERVIEW {PIXEL|BAND} : TIFF interleaving method
- –config BIGTIFF_OVERVIEW {IF_NEEDED|IF_SAFER|YES|NO} : is BigTIFF used
建立金字塔
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
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()