python可视化DEM遥感影像(tif格式)||xarray使用

1.利用xarray导入tif格式的DEM影像,并让其可视化。
参考博客:主要文章博客1博客2
代码如下:
首先导入相关的包:

import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.io.shapereader import Reader
from osgeo import gdal
import cmaps
import matplotlib as mpl
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
from matplotlib import rcParams

其次导入文件:

BJ_tiff=r'D:\google\earth_engine\Gee_Gis_file\GuiZhou\毕节市\Bijie_Tif\Bijie.tif'
BJ_DEM=r'D:\google\earth_engine\Gee_Gis_file\DEM\BJ_DEM_Elevation.tif'
HeNan_tiff=r'D:\google\earth_engine\Gee_Gis_file\DEM\HeNan_Elevation.tif'

然后读取文件并可视化显示:

if __name__=='__main__':
   BJ_dem=xr.open_rasterio(BJ_DEM)
   X, Y = np.meshgrid(BJ_dem.x,BJ_dem.y)
   Z=np.array(BJ_dem.sel(band=1))
   proj=ccrs.PlateCarree()
   extent = [min(BJ_dem.x),max(BJ_dem.x),min(BJ_dem.y),max(BJ_dem.y)]
   fig = plt.figure(figsize=(14, 10),dpi=600)
   ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
   ax.set_xticks(np.arange(extent[0], extent[1] + 1,0.3), crs = proj)
   ax.set_yticks(np.arange(extent[-2], extent[-1] + 1,0.3), crs = proj)
   ax.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label=False))
   ax.yaxis.set_major_formatter(LatitudeFormatter())
   ax.set_extent(extent, crs=ccrs.PlateCarree())#增加经度和纬度
   shp_path = r'D:\google\earth_engine\Gee_Gis_file\GuiZhou\Bijie_IL\Bijie_IL.shp'
   proj = ccrs.PlateCarree() 
   reader = Reader(shp_path)
   provinces = cfeature.ShapelyFeature(reader.geometries(), proj,edgecolor='k', facecolor='none',alpha=1)
   ax.add_feature(provinces, linewidth=0.65)
   lev=np.arange(0,2400,200)
   ticks=[0,200,400,600,800,1000,1200,1400,1600,1800,2000,2200,2400]
   cf=ax.contourf(X,Y,Z,levels=lev,extend='both',transform=ccrs.PlateCarree(),cmap=cmaps.MPL_terrain)
   b=plt.colorbar(cf,ticks=ticks,shrink=0.55,orientation='vertical',extend='both',pad=0.015,aspect=20)
# plt.savefig('F:/Rpython/lp32/plot11.3.png',dpi=600)
   plt.show()

在这里插入图片描述
简单可视化为:
在这里插入图片描述

  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现遥感影像立体匹配算法,可以采用以下步骤: 1. 读入左右两幅遥感影像,可以采用 Python 的 GDAL 库进行读取。 ```python from osgeo import gdal # 读取左右两幅遥感影像 left_ds = gdal.Open('left.tif') right_ds = gdal.Open('right.tif') # 获取影像的宽度和高度 width = left_ds.RasterXSize height = left_ds.RasterYSize ``` 2. 提取左右两幅影像的 SIFT 特征点,可以采用 OpenCV 库进行实现。 ```python import cv2 # 读取左右两幅影像 left_img = cv2.imread('left.tif', cv2.IMREAD_GRAYSCALE) right_img = cv2.imread('right.tif', cv2.IMREAD_GRAYSCALE) # 创建 SIFT 特征提取器 sift = cv2.SIFT_create() # 提取左右两幅影像的 SIFT 特征点 left_kp, left_desc = sift.detectAndCompute(left_img, None) right_kp, right_desc = sift.detectAndCompute(right_img, None) ``` 3. 对左右两幅影像的特征点进行匹配,可以采用 OpenCV 库的 `FlannBasedMatcher` 进行实现。 ```python # 创建 Flann 匹配器 matcher = cv2.FlannBasedMatcher() # 对左右两幅影像的特征点进行匹配 matches = matcher.knnMatch(left_desc, right_desc, k=2) ``` 4. 进行 RANSAC 算法进行离群点去除和求解基础矩阵,可以采用 OpenCV 库的 `findFundamentalMat` 函数进行实现。 ```python # 进行 RANSAC 算法进行离群点去除和求解基础矩阵 left_pts = [] right_pts = [] for m1, m2 in matches: if m1.distance < 0.75 * m2.distance: left_pts.append(left_kp[m1.queryIdx].pt) right_pts.append(right_kp[m1.trainIdx].pt) left_pts = np.int32(left_pts) right_pts = np.int32(right_pts) F, mask = cv2.findFundamentalMat(left_pts, right_pts, cv2.FM_RANSAC, 0.1, 0.99) ``` 5. 根据基础矩阵和左右两幅影像的特征点,进行立体匹配,可以采用 OpenCV 库的 `cv2.reprojectImageTo3D` 函数进行实现。 ```python # 根据基础矩阵和左右两幅影像的特征点,进行立体匹配 disp = np.zeros_like(left_img) disp[left_pts[:, 1], left_pts[:, 0]] = cv2.computeDisparity(left_img, right_img) Q = np.float32([[1, 0, 0, -width/2], [0, -1, 0, height/2], [0, 0, 0, -focal_length], [0, 0, 1, 0]]) points_3D = cv2.reprojectImageTo3D(disp, Q) ``` 6. 将匹配得到的三维点云转换为 DEM,可以采用 Python 的 GDAL 库进行实现。 ```python # 将匹配得到的三维点云转换为 DEM driver = gdal.GetDriverByName('GTiff') out_ds = driver.Create('output_dem.tif', width, height, 1, gdal.GDT_Float32) out_ds.SetGeoTransform(left_ds.GetGeoTransform()) out_ds.SetProjection(left_ds.GetProjection()) out_band = out_ds.GetRasterBand(1) out_band.WriteArray(points_3D[:, :, 2]) out_band.SetNoDataValue(-9999) out_ds.FlushCache() out_ds = None ``` 完整代码如下:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值