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 image_path = 'C:\yingxiang\DJI_20230322140516_0026_V.JPG' image_dataset = gdal.Open(image_path) dsm_path = 'C:/sanwei/jianmo/Productions/Production_2/Production_2_DSM_part_2_2.tif' dsm_dataset = gdal.Open(dsm_path) # 读取数据 image = image_dataset.ReadAsArray() dsm = dsm_dataset.ReadAsArray() # 获取地面分辨率 ground_spacing = dsm_dataset.GetGeoTransform()[1] # 关闭数据集 image_dataset = None dsm_dataset = None # 调用函数 shadow_mask = extract_building_shadow(image, dsm, 5, 10) # 打印结果 print(shadow_mask) # 将掩膜叠加在数字表面模型上 masked_dsm = np.copy(dsm) masked_dsm[shadow_mask] = np.nan # 将遮蔽区域的高程值设为nan plt.imshow(masked_dsm, cmap='terrain') plt.show()这段代码怎么改可以让索引是两个的
时间: 2024-02-14 21:11:17 浏览: 27
不太明白您的问题是什么。如果您是想要让 `extract_building_shadow` 函数的输入参数变为元组 `(image, dsm)`,那么只需要将函数的第一行修改为 `def extract_building_shadow(data, ground_spacing, radius):`,然后在函数内部将 `image` 和 `dsm` 分别赋值为 `data[0]` 和 `data[1]` 即可。调用函数时,将 `(image, dsm)` 作为一个整体传递给函数即可。例如:`shadow_mask = extract_building_shadow((image, dsm), 5, 10)`。
相关问题
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 cv2.imwrite(output_path, shadow_mask.astype(np.uint8) * 255) return shadow_mask image = cv2.imread('C:\yingxiang\DJI_20230322140516_0026_V.JPG') dsm_path = 'C:/sanwei/jianmo/Productions/Production_2/Production_2_DSM_part_2_2.tif' dsm_dataset = gdal.Open(dsm_path) output_path = 'C:\yingxiang\mask.png'这段代码为什么运行后不能将掩膜结果保存
这可能是由于在保存 PNG 文件之前,尝试在代码中访问 `output_path` 变量,而此时该变量尚未定义。您可以将 `output_path` 变量的定义移动到函数之前,以确保在访问变量之前它已经存在。例如:
```
output_path = 'C:\yingxiang\mask.png'
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
cv2.imwrite(output_path, shadow_mask.astype(np.uint8) * 255)
return shadow_mask
image = cv2.imread('C:\yingxiang\DJI_20230322140516_0026_V.JPG')
dsm_path = 'C:/sanwei/jianmo/Productions/Production_2/Production_2_DSM_part_2_2.tif'
dsm_dataset = gdal.Open(dsm_path)
# 调用函数
extract_building_shadow(image, dsm_dataset.ReadAsArray(), 10, 10)
```
请注意,此代码还将 `dsm` 数据集转换为数组,并将其传递给函数。
def spiral_search(center, radius, step): x, y = center yield x, y for r in range(1, radius + step, step): for i, (dx, dy) in enumerate(((1, 0), (0, 1), (-1, 0), (0, -1))): for j in range(r - (i % 2)): x += dx y += dy yield x, y # 定义建筑物遮蔽区域提取函数 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 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这段代码怎么改避免以下错误The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
这个错误通常是由于在条件语句中使用了多个元素的数组而导致的。可以使用 `np.all()` 或 `np.any()` 函数来解决这个问题。在这段代码中,可以将 `if not shadow_mask[i, j]:` 改为 `if not np.any(shadow_mask[i, j]):`,将 `if np.any(shadow_mask[x, y]):` 改为 `if np.any(shadow_mask[x:x+1, y:y+1]):`。修改后的代码如下:
```
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:x+1, y:y+1]):
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
```
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![xlsx](https://img-home.csdnimg.cn/images/20210720083732.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)