GDAL+Python实现栅格影像处理之拼接镶嵌Mosaic

GDAL+Python实现栅格影像处理之镶嵌

镶嵌概念

镶嵌是指将有重叠区域的多个图像根据其地理坐标将其拼接生成一个图像的过程。
实现原理:

  • 1、计算各个待镶嵌图像的四至范围,然后对计算的各个待镶嵌的图像的四至范围求并得
    到整个镶嵌结果的四至范围
  • 2、通过指定输出图像的分辨率以及计算的四至范围计算输出图像的大小,并创建输出图像
  • 3、循环处理每个待镶嵌图像,将待镶嵌图像的像元读取出来并写入镶嵌结果图像中的对应位置
  • 4、处理完所有的待镶嵌图像,关闭结果图像,清理资源等

使用方法

在讲述方法之前,列举一下numpy中的几个例子,因为下面我们会使用。

    a=numpy.array([(2,23,4),(23,3,4),(2345,56,8)])
    # 矩阵切片替换 将a矩阵2行 数据替换
    a[1,:]=(56,3,5) 
    b=numpy.array([(54,34,23)])
    # 矩阵增加维度(行数和列数) 在a矩阵下增加其行数
    print(numpy.r_[a,b]
  • 方法1 :通过镶嵌原理自定义方法实现。由于我的两幅图像位置固定,未根据其他情况进行拼接。读者可以参考这种方式,因为理解思路最重要。

代码实现

def RasterMosaic():
    ds=gdal.Open(inputfilePath,gdal.GA_ReadOnly)
    db=gdal.Open(referencefilefilePath,gdal.GA_ReadOnly)
    # todo 判断两影像相对位置(计算一副图像顶点对应在另一幅影像中的行列号)
    Originx = int((ds.GetGeoTransform()[0]-db.GetGeoTransform()[0])/db.GetGeoTransform()[1])
    Originy = int((ds.GetGeoTransform()[3]-db.GetGeoTransform()[3])/db.GetGeoTransform()[5])
    # 第一步判断顶点是否在其中
    if(Originx<db.RasterXSize and Originy<db.RasterYSize):
        print("顶点在其内")
        # 第二步判断右下角是否在其内
        OriginRightx=Originx+ds.RasterXSize
        OriginRighty=Originy+ds.RasterYSize
        # 根据两顶点判断其上下左右的情况
        if(OriginRightx<db.RasterXSize and OriginRighty<db.RasterYSize):
            print("右下角也在其内")
        elif(OriginRightx<db.RasterXSize and OriginRighty <db.RasterySize):
            print("右下角不在其内且右边界未超出最大边界")
            # todo 将两幅影像公共部分分别都表示出来
            data1 = ds.GetRasterBand(1).ReadAsArray(0, 0, ds.RasterXSize, ds.RasterYSize)[0:db.RasterYSize - Originy,
                    0:ds.RasterXSize]
            data2 = db.GetRasterBand(1).ReadAsArray(0, 0, db.RasterXSize, db.RasterYSize)[
                    Originy:db.RasterYSize - Originy, Originx:Originx + ds.RasterXSize]
            # 表示出在外部的那一部分数据
            dataexcept = ds.GetRasterBand(1).ReadAsArray(0, 0, ds.RasterXSize, ds.RasterYSize)[
                         db.RasterYSize - Originy:ds.RasterYSize, 0:ds.RasterXSize]
            print(ds.RasterYSize - (db.RasterYSize - Originy))
            datacommon = numpy.zeros(shape=(ds.RasterYSize - (db.RasterYSize - Originy), db.RasterYSize), dtype=int)
            datacommon[:, Originx:ds.RasterXSize + Originx] = dataexcept
            data = numpy.r_[db.GetRasterBand(1).ReadAsArray(0, 0, db.RasterXSize, db.RasterYSize), datacommon]
        elif(OriginRightx>db.RasterXSize and OriginRighty<db.RasterYSize):
            print("右下角不在其内且右边界超出最大边界并且下边界未超出最大边界")
        elif(OriginRightx>db.RasterXSize and OriginRighty>db.RasterYSize):
            print("右下角不在其内且右边界超出最大边界并且下边界未超出最大边界")
            width=db.RasterYSize
            height=OriginRighty
        outputfilePath = 'G:/studyprojects/gdal/GdalStudy/Files/images/RasterMosaic.tif'
        ds = gdal.Open(inputfilePath, gdal.GA_ReadOnly)
        driver = gdal.GetDriverByName('GTiff')
        output = driver.Create(outputfilePath, Originx+ds.RasterXSize, db.RasterYSize, db.RasterCount, db.GetRasterBand(1).DataType)
        output.SetGeoTransform(db.GetGeoTransform())
        output.SetProjection(db.GetProjection())
        for i in range(db.RasterCount):
            # todo 将两幅影像公共部分分别都表示出来
            data1 = ds.GetRasterBand(i+1).ReadAsArray(0, 0, ds.RasterXSize, ds.RasterYSize)[0:ds.RasterYSize,
                    0:db.RasterXSize - Originx]
            data2 = db.GetRasterBand(i+1).ReadAsArray(0, 0, db.RasterXSize, db.RasterYSize)[
                    Originy:ds.RasterYSize + Originy, Originx:db.RasterXSize]
            # 表示出在外部的那一部分数据  这里是我已知我的图像位置,只写了一种情况。
            dataexcept = ds.GetRasterBand(i+1).ReadAsArray(0, 0, ds.RasterXSize, ds.RasterYSize)[0:ds.RasterYSize,
                         db.RasterXSize - Originx:ds.RasterXSize]
            datacommon = numpy.zeros(shape=(db.RasterYSize, ds.RasterXSize - (db.RasterXSize - Originx)), dtype=int)
            datacommon[Originy:ds.RasterYSize + Originy, :] = dataexcept
            data = numpy.c_[db.GetRasterBand(i+1).ReadAsArray(0, 0, db.RasterXSize, db.RasterYSize), datacommon]
            output.GetRasterBand(i + 1).WriteArray(data, 0, 0)
            output.GetRasterBand(i + 1).SetNoDataValue(0)  # todo 给各波段设置nodata值
            output.GetRasterBand(i + 1).FlushCache()  # todo 波段统计量
    else:
        print("顶点不在其内")
  • 方法2:方法2采用gdal.Warp()提供的接口进行镶嵌

代码实现

def RasterMosaic():
    print("图像拼接")
    inputrasfile1 = gdal.Open(inputfilePath, gdal.GA_ReadOnly) # 第一幅影像
    inputProj1 = inputrasfile1.GetProjection()
    inputrasfile2 = gdal.Open(referencefilefilePath, gdal.GA_ReadOnly) # 第二幅影像
    inputProj2 = inputrasfile2.GetProjection()
    outputfilePath = 'G:/studyprojects/gdal/GdalStudy/Files/images/RasterMosaic2.tif'
    options=gdal.WarpOptions(srcSRS=inputProj1, dstSRS=inputProj1,format='GTiff',resampleAlg=gdalconst.GRA_Bilinear)
    gdal.Warp(outputfilePath,[inputrasfile1,inputrasfile2],options=options)

效果展示

原始两幅图像位置:
在这里插入图片描述
新的影像:
在这里插入图片描述
如动图所示:
在这里插入图片描述

  • 7
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
gdal是一个用于空间数据处理的库,它提供了许多功能来处理栅格数据,如图像处理、地理坐标转换等。Python是一种常用的编程语言,gdal库可以与Python结合使用,以便更方便地处理栅格数据。 直方图均衡是一种图像增强的技术,用于增强图像的对比度和亮度。在gdal python中,可以使用HistogramEqualization函数来实现直方图均衡。 首先,我们需要打开要进行直方图均衡的图像文件。可以使用gdal.Open函数来打开图像文件,并将其读取为一个gdal数据集。然后,可以使用GetRasterBand方法来获取图像的每个波段。接下来,可以使用ReadAsArray方法将波段数据读取为一个numpy数组。 然后,我们可以使用numpy.histogram函数来计算图像的直方图。直方图是对图像中不同像素值的统计。然后,可以使用numpy.cumsum函数计算累积分布函数(CDF),并将其标准化为0到255之间的范围。 接下来,我们可以使用numpy.interp函数来对图像的像素值进行重新映射,并使用numpy.uint8类型将其限制在0到255之间。然后,可以使用gdal.Band.WriteArray方法将修改后的数据写入原始图像文件中。 最后,我们应该注意,直方图均衡可能会导致图像的某些区域过亮或过暗,这可能需要进一步的处理来调整图像的对比度。例如,可以使用线性拉伸和直方图规定化等技术来进一步增强图像。 总之,gdal python提供了直方图均衡的功能,可以通过打开图像文件、计算直方图、进行像素值重新映射和写入修改后的数据来实现。直方图均衡是一种常用的图像增强技术,可以提高图像的对比度和亮度。但需要注意,直方图均衡可能导致某些图像区域变得过亮或过暗,可能需要进一步处理来调整图像的对比度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值