利用遥感影像阴影建筑物高度计算

遥感影像阴影指因倾斜照射,地物自身遮挡能源而造成影像上的暗色调,它反映了地物的空间结构特征,阴影不仅增强立体感,而且它的形状和轮廓还显示了地物的高度和侧面形状,有助于地物的识别。

遥感影像阴影,可根据侧影的长度和照射角度,推算出地物的高度;当然阴影也会拖盖一些信息,给解译工作带来麻烦。所以出发的目的不同,评判就不一。

提取精度:83%以上(验证三处)

先上图,为提取效果:

具体方法及步骤:

首先进行阴影提取,然后计算太阳方位角方向的阴影边长,根据三角函数相关公式计算得到建筑物高度,通过分析太阳和卫星天顶角存在a,b两种情况:

数据来源:遥感集市样例数据,下载方法参照:https://mp.csdn.net/postedit/81124974

数据获取时间:2014-09-27 11:04:41(仅作为练习操作使用)

具体步骤:

步骤一:对原始数据进行预处理,包括辐射定标、正射校正、大气校正和影像融合。

步骤二:进行ROI选择,平均光谱角分类(具体参照:https://blog.csdn.net/qq_33356563/article/details/84578113)。

步骤三:分类后处理---小斑点处理(Majority和Minority分析 )。

步骤四:栅格转矢量。

步骤五:剔除异常矢量值(根据面积大小)。

步骤六:阴影长度计算(Python+GDAL

步骤七:ArcGIS中进行字段计算器计算值(注意:角度与弧度的转换)

   

 

计算公式:

精度粗略估计:

       

街景地图验证:

 

说明:主旨在于参考论文思路的实现,精度不高的原因自我分析主要在于:1.阴影边缘的处理;2.阴影长度的提取。

 

### 提取或生成建筑轮廓数据的方法 为了实现从遥感图像或其他地理空间数据中提取建筑物轮廓的功能,可以通过多种方法完成此操作。以下是基于 Python 的一种解决方案,利用 OpenCV 和 Shapely 库来处理星影像并生成建筑轮廓。 #### 使用 OpenCV 和 Shapely 处理星影像 以下代码展示了如何通过 `get_building_contours` 函数获取指定范围内的建筑物轮廓信息,并将其转换为 OpenCV 支持的格式: ```python import cv2 import requests from shapely.geometry import Polygon, box import numpy as np def get_satellite_image(bbox, ak): """ 获取指定边界框 (bbox) 范围内的星影像。 :param bbox: 边界框坐标 [min_lon, min_lat, max_lon, max_lat] :param ak: 百度地图 API 密钥 :return: 星影像图 """ url = f"http://api.map.baidu.com/staticimage/v2?" params = { "ak": ak, "width": 800, "height": 600, "center": f"{(bbox[0]+bbox[2])/2},{(bbox[1]+bbox[3])/2}", "zoom": 18, "scale": 1, "markers": "", "markerStyles": "" } response = requests.get(url, params=params) image_array = np.asarray(bytearray(response.content), dtype=np.uint8) return cv2.imdecode(image_array, cv2.IMREAD_COLOR) def get_building_contours(image, threshold_value=127): """ 从输入图像中提取建筑物轮廓。 :param image: 输入的星影像 :param threshold_value: 阈值分割参数,默认为 127 :return: 建筑物轮廓列表 """ gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, threshold_value, 255, cv2.THRESH_BINARY_INV) contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) building_polygons = [] for contour in contours: epsilon = 0.01 * cv2.arcLength(contour, True) approx_polygon = cv2.approxPolyDP(contour, epsilon, True).flatten() if len(approx_polygon) >= 6: # 至少有3个顶点构成多边形 polygon_coords = [(approx_polygon[i], approx_polygon[i+1]) for i in range(0, len(approx_polygon)-1, 2)] building_polygons.append(Polygon(polygon_coords)) return building_polygons # 测试代码 if __name__ == "__main__": BBOX = [116.397416, 39.907872, 116.399416, 39.909872] # 示例边界框 AK = "your_baidu_map_api_key_here" # 替换为您的百度地图API密钥 satellite_image = get_satellite_image(BBOX, AK) buildings = get_building_contours(satellite_image) print(f"共检测到 {len(buildings)} 个建筑物轮廓") ``` 上述代码实现了以下几个功能: - **获取星影像**:通过调用百度地图静态图服务接口下载指定区域的高分辨率星影像[^2]。 - **阈值分割与边缘检测**:将彩色星影像转化为灰度图像后应用二值化处理,从而突出目标对象(即建筑物)。 - **轮廓提取与几何建模**:使用 OpenCV 找到闭合轮廓并通过 Shapely 创建对应的多边形对象。 #### 利用 DS-Net 进一步优化模型性能 如果希望提高精度,则可考虑引入深度学习框架训练自定义网络结构来进行更精确的目标识别任务。例如,在论文《DS-Net》中提到的一种针对灾害场景下受损建筑物自动标注的技术方案可能适用于复杂背景下的精细分类需求[^3]。 ---
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值