电商网站建设培训学校,东莞市永铭装饰有限公司,南充移动网站建设,网站换空间的流程GDAL和 Pillow
GDAL和PIL处理和操作的对象都是栅格图像。 但它们又不一样。 GDAL主要重点放在地理或遥感数据的读写和数据建模以及地理定位和转换#xff0c; 但是PIL的重点是放在图像本身处理上的。
至于在底层数据处理上#xff0c;两者都可以用 numpy 转化的二进制作为数…GDAL和 Pillow
GDAL和PIL处理和操作的对象都是栅格图像。 但它们又不一样。 GDAL主要重点放在地理或遥感数据的读写和数据建模以及地理定位和转换 但是PIL的重点是放在图像本身处理上的。
至于在底层数据处理上两者都可以用 numpy 转化的二进制作为数据处理。 所以理论上是可以互相共享和交换数据的。实际上也确实可以。
GDAL的核心在波段band 一切操作的基础和核心都在波段。 波段可以单独拿出来操作至于波段在数据集中的顺序无关紧要。 因为遥感图像大多比RGB图像的波段要多而每个波段单独都是一个完整的整体 每个波段单独拿出来都是一个数据集。而 Pillow 的核心在数据集DataSet这里的概念是对应GDAL中的数据集的概念。 当然在 Pillow 本身中没有这种说法也就是不把波段单独操作 操作大部分需要RGB一体化地进行。
两部分的操作的主要衔接部分就是创建、读取与写入。 读取数据后怎么处理是两个库各自的事情。 所以这里主要内容就是介绍两个库各自的创建读取和写入的操作以及两个库的过渡。
1. 使用GDAL读取数据
比较两个库的读取GDAL读取一个图像中的数据 from osgeo import gdaldataset gdal.Open(/gdata/geotiff_file.tif)data_arr dataset.ReadAsArray(30,70,5,5)type(data_arr)
numpy.ndarraydata_arr
array([[[147, 141, 151, 146, 145],[148, 149, 151, 143, 139],[163, 164, 162, 152, 149],[167, 169, 164, 160, 159],[168, 172, 162, 162, 164]],[[ 7, 4, 17, 12, 11],[ 7, 10, 14, 6, 2],[ 10, 11, 11, 3, 0],[ 8, 10, 8, 4, 4],[ 12, 16, 6, 6, 9]],[[ 18, 12, 24, 19, 18],[ 16, 17, 21, 13, 9],[ 15, 16, 16, 7, 6],[ 13, 14, 11, 8, 10],[ 16, 20, 10, 10, 15]]], dtypeuint8)data_bin dataset.ReadRaster(30,70,5,5)data_bin
bx93x8dx97x92x91x94x95x97x8fx8bxa3xa4xa2x98x95xa7xa9xa4xa0x9fxa8xacxa2xa2xa4x07x04x11x0cx0bx07nx0ex06x02nx0bx0bx03x00x08nx08x04x04x0cx10x06x06tx12x0cx18x13x12x10x11x15rtx0fx10x10x07x06rx0ex0bx08nx10x14nnx0f打开了数据集就有两种方法来获取数据。虽然读出的一个是二进制一个是数组Numpy数组用tostirng转换出来的二进制和用ReadRaster读出的相同。 data_arr.tostring()
ipython-input-5-e83da5e06f5b:1: DeprecationWarning: tostring() is deprecated. Use tobytes() instead.data_arr.tostring()
bx93x8dx97x92x91x94x95x97x8fx8bxa3xa4xa2x98x95xa7xa9xa4xa0x9fxa8xacxa2xa2xa4x07x04x11x0cx0bx07nx0ex06x02nx0bx0bx03x00x08nx08x04x04x0cx10x06x06tx12x0cx18x13x12x10x11x15rtx0fx10x10x07x06rx0ex0bx08nx10x14nnx0f从波段中获取数据和从数据集中获取数据的方法十分相似。
2. 使用Pillow读取数据
注意使用Pillow读取时要注意其类型。 from PIL import Imageim Image.open(/gdata/geotiff_file.tif)region im.crop((30,70,35,75))region.tobytes()
bx93x07x12x8dx04x0cx97x11x18x92x0cx13x91x0bx12x94x07x10x95nx11x97x0ex15x8fx06rx8bx02txa3nx0fxa4x0bx10xa2x0bx10x98x03x07x95x00x06xa7x08rxa9nx0exa4x08x0bxa0x04x08x9fx04nxa8x0cx10xacx10x14xa2x06nxa2x06nxa4tx0fim可以类比成gdal的datasetim也可以从DataSet中提取某个范围的数据。 可以看出虽然读取的都是同样位置的数据但是输出的结果不一样。
3. Pillow与GDAL读取数据的转换
这里注意GDAL与Pillow的空间模型并不一致。 在Pillow的下截取区域矩形的定义和GDAL不同GDAL是顶点X、顶点Y、宽、高 Pillow是顶点X、顶点Y、终点X终点Y。 这就是GDAL和Pillow的区别。转换一下 import numpy as npdata dataset.ReadAsArray(30,70,5,5)datas [i for i in data]from numpy import reshapedatas [reshape(i,(-1,1)) for i in data]datas np.concatenate(datas,1)datas.tostring()
ipython-input-8-b652c983ce99:7: DeprecationWarning: tostring() is deprecated. Use tobytes() instead.datas.tostring()
bx93x07x12x8dx04x0cx97x11x18x92x0cx13x91x0bx12x94x07x10x95nx11x97x0ex15x8fx06rx8bx02txa3nx0fxa4x0bx10xa2x0bx10x98x03x07x95x00x06xa7x08rxa9nx0exa4x08x0bxa0x04x08x9fx04nxa8x0cx10xacx10x14xa2x06nxa2x06nxa4tx0f可以看到现在结果一致了。这里就表现了两个库的设计概念模型的不同。 GDAL把图像看成是由不同传感器获取的不同频率的电磁波构成的影像文件读取的数据是默认的以band组织的 Pillow则把图像看成是由单个像素构成的每个像素是记录的由RGB三色构成的像素颜色的数据。
4. 从波段来看
如果是单个波段就不存在RGB存储的问题了。使用下面的方式打开可以看出读取数据时两个库读取的结果是一样的。 r,g,b region.split()r.tobytes()
bx93x8dx97x92x91x94x95x97x8fx8bxa3xa4xa2x98x95xa7xa9xa4xa0x9fxa8xacxa2xa2xa4band dataset.GetRasterBand(1)band.ReadRaster(30,70,5,5)
bx93x8dx97x92x91x94x95x97x8fx8bxa3xa4xa2x98x95xa7xa9xa4xa0x9fxa8xacxa2xa2xa4