gdal和PIL的互操作

前面提到过,gdal和PIL很相像。它们处理和操作的对象都是栅格图像。但它们又不一样。gdal主要重点放在地理或遥感数据的读写和数据建模以及地理定位和转换,但是PIL的重点是放在图像本身处理上的。

至于在底层数据处理上,两者都可以用Numeric转化的二进制作为数据处理。所以,理论上是可以互相共享和交换数据的。实际上也确实可以。

首先,我要说明的是gdal的核心在波段(band),一切操作的基础和核心都在波段。波段可以单独拿出来操作,至于波段在数据集中的顺序无关紧要。因为遥感图像大多比RGB图像的波段要多,而每个波段单独都是一个完整的整体,每个波段单独拿出来就是一个数据集。而PIL的核心在数据集(DataSet)这里数据集的概念是对应gdal中的数据集的概念,可能在PIL本身中没有这种说法。也就是不把波段单独操作。操作大部分需要RGB一体化地进行。

两部分的操作的主要衔接部分就是创建和读取,以及写入。至于进去了里面怎么变化就是两个库各自的事情了。所以这篇文章的主要内容就是介绍两个库各自的创建,读取和写入的操作,以及两个库的过渡。

比较两个库的读取,gdal读取一个图像中的数据

   1 >>> import gdal
   2 >>> dataset = gdal.Open("j:/gisdata/gtif/sd.tif")

打开了数据集,就有两种方法来获取数据。一种是通过数据集

   1 >>> help(dataset.ReadRaster)
   2 Help on method ReadRaster in module gdal:
   3 ReadRaster(self, xoff, yoff, xsize, ysize, buf_xsize=None, buf_ysize=None, buf_t
   4 ype=None, band_list=None) method of gdal.Dataset instance
   5 >>> help(dataset.ReadAsArray)
   6 Help on method ReadAsArray in module gdal:
   7 ReadAsArray(self, xoff=0, yoff=0, xsize=None, ysize=None) method of gdal.Dataset
   8  instance
   9 >>>

其中ReadRaster读出的是二进制(在python是str类型),ReadAsArray读出的是Numeric数组。

从波段中获取数据和从数据集中获取数据有十分相似的方法。

   1 >>> help(band.ReadAsArray)
   2 Help on method ReadAsArray in module gdal:
   3 ReadAsArray(self, xoff=0, yoff=0, win_xsize=None, win_ysize=None, buf_xsize=None
   4 , buf_ysize=None, buf_obj=None) method of gdal.Band instance
   5 >>> help(band.ReadRaster)
   6 Help on method ReadRaster in module gdal:
   7 ReadRaster(self, xoff, yoff, xsize, ysize, buf_xsize=None, buf_ysize=None, buf_t
   8 ype=None) method of gdal.Band instance
   9 >>>

而PIL打开获取数据的过程如下:

   1 >>> import Image
   2 >>> im = Image.open("J:/gisdata/gtif/sd.tif")
   3 >>> dir(im)
   4 ['_Image__transformer', '_TiffImageFile__first', '_TiffImageFile__fp', '_TiffIma
   5 geFile__frame', '_TiffImageFile__next', '__doc__', '__init__', '__module__', '_c
   6 ompression', '_copy', '_decoder', '_dump', '_expand', '_makeself', '_new', '_ope
   7 n', '_planar_configuration', '_seek', '_setup', '_tell', 'category', 'convert',
   8 'copy', 'crop', 'decoderconfig', 'decodermaxblock', 'draft', 'filename', 'filter
   9 ', 'format', 'format_description', 'fp', 'fromstring', 'getbands', 'getbbox', 'g
  10 etcolors', 'getdata', 'getextrema', 'getim', 'getpalette', 'getpixel', 'getproje
  11 ction', 'histogram', 'ifd', 'im', 'info', 'load', 'load_end', 'load_prepare', 'm
  12 ode', 'offset', 'palette', 'paste', 'point', 'putalpha', 'putdata', 'putpalette'
  13 , 'putpixel', 'quantize', 'readonly', 'resize', 'rotate', 'save', 'seek', 'show'
  14 , 'size', 'split', 'tag', 'tell', 'thumbnail', 'tile', 'tobitmap', 'tostring', '
  15 transform', 'transpose', 'verify']

im可以类比成gdal的dataset,im也可以从DataSet中提取某个范围的数据。

   1 >>> region = im.crop((100,100,120,120))
   2 >>> region.tostring()
   3 '\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
   4 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
   5 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
   6 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
   7 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
   8 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
   9 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
  10 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
  11 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
  12 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
  13 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
  14 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
  15 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
  16 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
  17 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
  18 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
  19 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
  20 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
  21 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
  22 f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf
  23 f'