Python批量化实现SAR图像的海陆分割

Python批量化实现SAR图像的海陆分割

本篇文章介绍使用高精度的海岸线shapefile文件,制作SAR图像的陆地掩膜,在Python上使用Gdal库批量实现SAR图像的海陆分割

用到的海岸线文件是German FOSSGIS小组(https://www.fossgis.de/) 从OSM海岸线中制作了shapefile格式的文件,下载地址为https://osmdata.openstreetmap.de/data/land-polygons.html

使用QGIS软件打开下载好的陆地掩膜文件land-polygons.shp
image

SAR图像海陆分割的实现主要分为3步

第一步:根据原始SAR图像的tiff文件,提取SAR图像的地理坐标范围,再依据这个坐标范围制作SAR图像的范围掩膜shp文件
image

第二步:使用第一步制作好的范围掩膜shp文件,裁剪全球海岸线land-polygons.shp文件,得到SAR图像范围内的陆地掩膜shp文件
image
image

第三步:使用第二步裁剪下来的陆地掩膜文件,用gdal.Warp函数裁剪原始的SAR图像,实现SAR图像的海陆分割

最终效果图
image

代码如下

import osgeo.osr as osr
import os
import numpy as np
from osgeo import gdal
import shapefile      # 使用pyshp

os.environ['PROJ_LIB'] = r'C:\Users\sjtu\.conda\envs\test_torch\Lib\site-packages\osgeo\data\proj'

class Dataset:
    def __init__(self, in_file):
        self.in_file = in_file  # Tiff或者ENVI文件
        self.dataset = gdal.Open(self.in_file)
        self.XSize = self.dataset.RasterXSize  # 网格的X轴像素数量
        self.YSize = self.dataset.RasterYSize  # 网格的Y轴像素数量
        self.GeoTransform = self.dataset.GetGeoTransform()  # 投影转换信息
        self.ProjectionInfo = self.dataset.GetProjection()  # 投影信息
        print(self.GeoTransform)

    def get_lon_lat(self): #获取经纬度信息
        gtf = self.GeoTransform
        coord = []
        left_xy = [gtf[0] - 100, gtf[3] + 100] #[gtf[3], gtf[0]]
        coord.append(left_xy)
        for [x, y] in ([self.XSize + 70, 0], [self.XSize + 70, self.YSize + 70], [0, self.YSize + 70]):
            lat = gtf[0] + x * gtf[1] + y * gtf[2] - 100
            lon = gtf[3] + x * gtf[4] + y * gtf[5] + 100
            coord.append([lat, lon])
        return coord

    def geo2lonlat(self):  #地理坐标转经纬度
        coords = self.get_lon_lat()
        prosrs = osr.SpatialReference()
        prosrs.ImportFromWkt(self.ProjectionInfo) #dataset.GetProjection()
        geosrs = prosrs.CloneGeogCS()
        ct = osr.CoordinateTransformation(prosrs, geosrs)
        L_Lcoords = []
        for coord in coords:
            tmp_coords = ct.TransformPoint(coord[0], coord[1])
            L_Lcoords.append(tmp_coords[:2][::-1])
        return L_Lcoords

    def cut_tiff(self, output_raster, input_shape):
        ds = gdal.Warp(output_raster,
                       self.dataset,
                       format='GTiff',
                       cutlineDSName = input_shape,  # or any other file format
                       # cutlineWhere="FIELD = 'whatever'",
                       # optionally you can filter your cutline (shapefile) based on attribute values
                       # dstNodata=0
                       )  # select the no data value you like
        ds = None
        print("done")

def main(tiff_path):
    dataset = Dataset(tiff_path)       #tiff_path:"E:/new_SAR_data/舰船数据集/1/SARShip-1.0-1/SARShip-1.0-1.tiff"
    coord = dataset.geo2lonlat()  # 获取经纬度信息
    print(coord)

    dir_path = os.path.dirname(tiff_path) #dir_path:"E:/new_SAR_data/舰船数据集/1/SARShip-1.0-1"
    tiff2shp = os.path.join(dir_path, r"cover_shp\rect.shp" ) # 新建数据存放位置
    file = shapefile.Writer(tiff2shp)
    # 创建两个字段
    file.field('FIRST_FLD')
    file.field('type', 'C', '40')
    file.poly([coord])
    file.record('First', 'polygon')

    # 关闭文件操作流
    file.close()
    # 定义投影
    proj = osr.SpatialReference()
    proj.ImportFromEPSG(4326) # 4326-GCS_WGS_1984; 4490- GCS_China_Geodetic_Coordinate_System_2000
    wkt = proj.ExportToWkt()
    # 写入投影
    f = open(tiff2shp.replace(".shp", ".prj"), 'w')
    f.write(wkt)
    f.close()

    input_shp = r'D:\software_stu\QGIS\land-polygons-complete-4326\land_polygons.shp'  #海陆分割固定
    clip_shp = tiff2shp
    output_shp = os.path.join(dir_path, "cover_shp\output.shp" ) # 新建数据存放位置 r'E:\new_SAR_data\舰船数据集\1\SARShip-1.0-1\cover_shp\output1.shp'

    func_name = "ogr2ogr -clipsrc "
    command = func_name + " " + clip_shp + " " + output_shp + " " + input_shp
    os.system(command)

    if not os.path.exists(os.path.join(dir_path, "output")):
        os.makedirs(os.path.join(dir_path, "output"))
    output_raster = os.path.join(dir_path, "output\output.tiff" ) #r'E:/new_SAR_data/舰船数据集/1/SARShip-1.0-1/output.tiff'   #输出海陆分割后的SAR图像
    dataset.cut_tiff(output_raster, output_shp)

if __name__ == '__main__':
    # dataset_path = r'E:\new_SAR_data\舰船数据集\1'
    # for dir in os.listdir(dataset_path):
    #     sub_path = os.path.join(dataset_path, dir)
    #     if os.path.isdir(sub_path):
    #         tiff_path = os.path.join(sub_path, dir + '.tiff')
    #         print(tiff_path)
    #         main(tiff_path)
    tiff_path = r'E:\new_SAR_data\Radar_Data\SAR_Image_Data\0.5米SAR\0.5米舰船和飞机\0.5米舰船和飞机\横须贺\SAR_000209472_007_001_004_L2.tiff'
    main(tiff_path)



注意:
第二步的时候,没有在gdal库里找到shp裁剪shp的函数,所以使用了QGIS里自带的ogr2ogr.exe

ogr2ogr的命令行输入为:ogr2ogr -clipsrc 图像范围.shp 输出.shp land_polygons.shp

python里的代码为

func_name = "ogr2ogr -clipsrc "
command = func_name + " " + clip_shp + " " + output_shp + " " + input_shp
os.system(command)

引用
https://blog.csdn.net/jiangshuanshuan/article/details/109116136
https://blog.csdn.net/NingAnMe/article/details/98587363
https://blog.csdn.net/t46414704152abc/article/details/77482747
https://theonegis.blog.csdn.net/article/details/54427906

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
python 遥感图像 水体提取系统 基于python深度学习实现高分辨率城市遥感图像的水体提取系统源码.zip 深度学习高分辨率城市遥感图像的水体提取系统源码.zip python 遥感图像 水体提取系统 基于python深度学习实现高分辨率城市遥感图像的水体提取系统源码.zip 深度学习高分辨率城市遥感图像的水体提取系统源码.zip python 遥感图像 水体提取系统 基于python深度学习实现高分辨率城市遥感图像的水体提取系统源码.zip 深度学习高分辨率城市遥感图像的水体提取系统源码.zippython 遥感图像 水体提取系统 基于python深度学习实现高分辨率城市遥感图像的水体提取系统源码.zip 深度学习高分辨率城市遥感图像的水体提取系统源码.zip python 遥感图像 水体提取系统 基于python深度学习实现高分辨率城市遥感图像的水体提取系统源码.zip 深度学习高分辨率城市遥感图像的水体提取系统源码.zip 【备注】 项目多为高分毕设,评审平均分达到95分以上,都经过本地验证,运行OK后上传,可直接运行起来。 主要针对计算机相关专业的正在做毕设的学生和需要项目实战的Java、JavaScript、c#、游戏开发、小程序开发学习者、深度学习等专业方向。 也可作为课程设计、期末大作业。包含:项目源码、数据库、项目说明等,该项目可以直接作为毕设、课程设计使用。 也可以用来学习参考借鉴!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值