gpt4 book ai didi

python - 使用 matplotlib 和 python 以非常低的分辨率存储图像的解决方法

转载 作者:太空宇宙 更新时间:2023-11-04 04:05:32 25 4
gpt4 key购买 nike

我试图通过将 map 的较高分辨率图像导出为非常低的分辨率来创建占用网格 map 。

在最基本的形式中,占用网格 是一个二维二进制数组。存储在数组中的值表示空闲(0)或占用(1)。每个值对应物理 map 的一个离散位置(下图描绘了一个区域) courtsy: mathworks

如上图所示,每个阵列位置都是物理世界的一个单元格。

我有一个 5 米 x 5 米的世界,然后将其离散化为 5 厘米 x 5 厘米的单元格。因此,世界是 100 x 100 个单元,对应于 5m x 5m 的物理世界。

障碍物在位置 (x,y) 和随机半径 r 随机生成圆盘,如下所示: created world

我需要将这张(上图)图像转换为大小为 100x100 的数组。这意味着评估每个单元格是否实际上位于障碍物区域或自由区域。

为了加快速度,我找到了以下解决方法:

使用 figsize=(5,5) 创建充满障碍物的 matplotlib 图,并使用 dpi=20bmp 格式保存图像,最后将 bmp 图像 作为 numpy 数组导入。 las,matplotlib 不支持 bmp。如果我使用 plt.savefig('map.jpg', dpi=20, quality=100) 或其他格式将图像保存为 jpeg,则单元格的边界会变得模糊并流入其他单元格。在此图像中显示: map in jpg 100 quality

所以我的问题是:如何从 matplotlib 中保存缩小图像以保留图像的单元清晰度(类似于 bmp)

最佳答案

不错的技巧。但是,我宁愿明确计算与您的离散化圆相对应的 bool 掩码。获得这种 bool 映射的一种简单方法是使用 matplotlib 艺术家的 contains_points 方法,例如 Circle 补丁。

#!/usr/bin/env python

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle

world_width = 100 # x
world_height = 100 # y
minimum_radius = 1
maximum_radius = 10
total_circles = 5

# create circle patches
x = np.random.randint(0, world_width, size=total_circles)
y = np.random.randint(0, world_height, size=total_circles)
r = minimum_radius + (maximum_radius - minimum_radius) * np.random.rand(total_circles)
circles = [Circle((xx,yy), radius=rr) for xx, yy, rr in zip(x, y, r)]

# for each circle, create a boolean mask where each cell element is True
# if its center is within that circle and False otherwise
X, Y = np.meshgrid(np.arange(world_width) + 0.5, np.arange(world_height) + 0.5)

masks = np.zeros((total_circles, world_width, world_height), dtype=bool)
for ii, circle in enumerate(circles):
masks[ii] = circle.contains_points(np.c_[X.ravel(), Y.ravel()]).reshape(world_width, world_height)

combined_mask = np.sum(masks, axis=0)
plt.imshow(combined_mask, cmap='gray_r')
plt.show()

enter image description here

关于python - 使用 matplotlib 和 python 以非常低的分辨率存储图像的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57424838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com