图像金字塔与QGIS下金字塔的创建

图像金字塔

这里简单的介绍下什么是图像金字塔,以及在GIS系统下创建图像金字塔的作用。

什么是图像金字塔

首先,图像金字塔是由一副图像生成得到的一系列分辨率逐渐降低的图像组成的集合。其构成方式类似于金字塔的形状,在最底层是最高分辨率的原始图像,逐渐向上,是依照特定的采样方法得到的低分辨率图像。其大致构造如下图:
图像金字塔与QGIS下金字塔的创建_第1张图片

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下创建金字塔的主要两个函数:

  1. 第一个是gdaladdo
  2. 第二个是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可以设置的参数

  1. -r : choice of resampling method (default: nearest)
  2. -ro : open the dataset in read-only mode, in order to generate external overview (for GeoTIFF datasets especially)
  3. -clean : remove all overviews
  4. -q : turn off progress display
  5. -b : band to create overview (if not set overviews will be created for all bands)
  6. filename: The file to build overviews for (or whose overviews must be removed).
  7. levels: A list of integral overview levels to build. Ignored with -clean option.

Useful configuration variables :
解释:此处是gdalddo可以选择的金字塔生成格式和压缩方式等信息

  1. –config USE_RRD YES : Use Erdas Imagine format (.aux) as overview format. Below, only for external overviews in GeoTIFF format:
  2. –config COMPRESS_OVERVIEW {JPEG,LZW,PACKBITS,DEFLATE} : TIFF compression
  3. –config PHOTOMETRIC_OVERVIEW {RGB,YCBCR,…} : TIFF photometric interp.
  4. –config INTERLEAVE_OVERVIEW {PIXEL|BAND} : TIFF interleaving method
  5. –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()

从代码运行情况可以看见金字塔成功创建:
图像金字塔与QGIS下金字塔的创建_第2张图片
然后在对应目录下,也能看见金字塔文件已经生成:
图像金字塔与QGIS下金字塔的创建_第3张图片
根据自己的需要,可以对
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()

你可能感兴趣的:(图像金字塔与QGIS下金字塔的创建)