请编写在这段代码中如何将结果画在原始影像上或dsm数据上的程序
时间: 2024-03-11 19:46:51 浏览: 55
好的,下面是一个将结果画在原始影像上的示例程序,使用的是 OpenCV 库中的绘图函数 cv2.rectangle() :
```python
import cv2
import numpy as np
from osgeo import gdal, gdal_array
# 定义建筑物遮蔽区域提取函数
def extract_building_shadow(image, dsm, ground_spacing, radius):
shadow_mask = np.zeros_like(image, dtype=np.bool)
for i in range(0, image.shape[0], ground_spacing):
for j in range(0, image.shape[1], ground_spacing):
if not np.any(shadow_mask[i, j]):
center = (i, j)
ground_height = dsm[i, j]
for x, y in spiral_search(center, radius, ground_spacing):
if x < 0 or x >= image.shape[0] or y < 0 or y >= image.shape[1]:
continue
if np.any(shadow_mask[x, y:]):
continue
height = dsm[x, y]
if height > ground_height:
shadow_mask[x, y] = True
elif height == ground_height:
if np.linalg.norm(np.array([x, y]) - np.array(center)) < \
np.linalg.norm(np.array([i, j]) - np.array(center)):
shadow_mask[x, y] = True
return shadow_mask
# 读取影像和 DSM 数据
image_path = 'C:\yingxiang\DJI_20230322140516_0026_V.JPG'
image = cv2.imread(image_path)
dsm_path = 'C:/sanwei/jianmo/Productions/Production_2/Production_2_DSM_part_2_2.tif'
dsm = gdal_array.LoadFile(dsm_path)
# 获取地面分辨率
ground_spacing = gdal.Open(dsm_path).GetGeoTransform()[1]
# 提取遮蔽区域
shadow_mask = extract_building_shadow(image, dsm, 5, 10)
shadow_mask = np.any(shadow_mask, axis=2)
# 在原始影像上画出遮蔽区域
contours, hierarchy = cv2.findContours(shadow_mask.astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
# 显示原始影像和画出的遮蔽区域
cv2.imshow('Image with Shadow Mask', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这个程序首先读取一张影像和对应的 DSM 数据,然后调用 extract_building_shadow() 函数提取遮蔽区域。接着,它使用 OpenCV 库中的 cv2.findContours() 函数找到遮蔽区域的轮廓,并使用 cv2.rectangle() 函数在原始影像上画出遮蔽区域,最后显示结果。
阅读全文