以编程方式减去不同尺寸的栅格

时间:2018-10-16 03:02:27

标签: python numpy opencv raster gdal

问题:

如何以编程方式返回两个(大小不同)红色波段之差的栅格?

gdal_calc.py -A 'WARPED.tif'  -B 'DSC_1636.tif' --outfile = 'dif.tif' --calc = "A-B"

QGIS栅格计算器可以很好地执行此功能。但是,前面的代码返回以下错误。

  

异常:错误!文件DSC_1636.tif(7380,4928)的尺寸不同于其他文件(7743,5507)。无法继续

我目前的印象是我应该使用定义的范围(通过找到如下所示的重叠区域来创建)读取栅格,但是我仍然无法完成这项工作。

# Subtract two rasters of different dimensions
# Pixel coordinates define overlap

import os, sys
from PIL import Image
from osgeo import gdal, ogr, osr
gdal.UseExceptions()

    # Use PIL to get information from images
im1 = Image.open('DSC_0934-warped.tif')
print('warped image size is %s ' % str(im1.size))

im2 = Image.open('DSC_1636.png')
print('initial image (image 2) size is %s' % str(im2.size))
  

变形的图像大小为(7743,5507)
  初始图片(图片2)的大小为(7380,4928)

# Use GDAL to get information about images
def get_extent(fn):
    '''Returns min_x, max_y, max_x, min_y'''
    ds = gdal.Open(fn)
    gt = ds.GetGeoTransform()
    return (gt[0], gt[3], gt[0] + gt[1] * ds.RasterXSize,
        gt[3] + gt[5] * ds.RasterYSize)

print('extent of warped.tif is %s' % str(get_extent('DSC_0934-warped.tif')))
print('extent of 1636.png is %s' % str(get_extent('DSC_1636.png')))
  

warped.tif的范围是(-375.3831214210602,692.5167764068751,7991.3588371542955,-5258.102875649754)
  1636.png的范围是(0.0,0.0,7380.0,4928.0)

r1 = get_extent('DSC_0934-warped.tif')
r2 = get_extent('DSC_1636.png')

# Get left, top, right, bottom of dataset's bounds in pixel coordinates
intersection = [max(r1[0], r2[0]), 
                min(r1[1], r2[1]), 
                min(r1[2], r2[2]), 
                max(r1[3], r2[3])]

print('checking for overlap')
if (intersection[2] < intersection[0]) or (intersection[1] > intersection[3]):
    intersection = None
    print('no overlap')
else:
    print('intersection overlaps at: %s' % intersection)
  

检查重叠
  相交处重叠:[0.0,0.0,7380.0,4928.0]

1 个答案:

答案 0 :(得分:0)

最直接的答案是将图像读取为定义的尺寸数组。

无需重新发布上面用于检查重叠位置的代码,可以通过添加以下内容来解决问题。 (谢谢@Val)

# Get the data
ds1_src = gdal.Open( "DSC_1636.png" )
ds2_src = gdal.Open( "DSC_0934-warped.tif")

ds1_bnd = ds1_src.GetRasterBand(1).ReadAsArray(xoff=0, yoff=0, win_xsize=7380, win_ysize=4928)
ds2_bnd = ds2_src.GetRasterBand(1).ReadAsArray(xoff=0, yoff=0, win_xsize=7380, win_ysize=4928)

# Do the maths...
data_out = ds2_bnd - ds1_bnd

#Write the out file
driver = gdal.GetDriverByName("GTiff")
dsOut = driver.Create("out.tiff", 7380, 4928, 1, GDT_Byte)
CopyDatasetInfo(ds1_src,dsOut)
bandOut=dsOut.GetRasterBand(1)
BandWriteArray(bandOut, data_out)

#Close the datasets
ds1_src = None
ds2_src = None
ds1_bnd = None
ds2_bnd = None
bandOut = None
dsOut = None