使用matplotlib和python以极低分辨率存储图像的变通方法
我试图通过将地图的高分辨率图像导出到非常低的分辨率来创建一个占用栅格地图 在最基本的形式中,占用网格是一个二维二进制数组。数组中存储的值表示空闲(0)或占用(1)。每个值对应于物理地图的离散位置(下图描绘了一个区域) 如上图所示,每个阵列位置都是物理世界的一个单元 我有一个5米x 5米的世界,它被离散成5厘米x 5厘米的细胞。因此,世界是100 x 100个单元,对应于5米x 5米的物理世界 障碍物在位置(x,y)处重新随机生成了具有随机半径r的圆盘,如下所示: 我需要把这个(上面的)图像转换成一个100x100大小的数组。这意味着评估每个单元是否实际位于障碍物区域或自由区域 为了加快速度,我找到了以下解决方法: 使用使用matplotlib和python以极低分辨率存储图像的变通方法,python,matplotlib,Python,Matplotlib,我试图通过将地图的高分辨率图像导出到非常低的分辨率来创建一个占用栅格地图 在最基本的形式中,占用网格是一个二维二进制数组。数组中存储的值表示空闲(0)或占用(1)。每个值对应于物理地图的离散位置(下图描绘了一个区域) 如上图所示,每个阵列位置都是物理世界的一个单元 我有一个5米x 5米的世界,它被离散成5厘米x 5厘米的细胞。因此,世界是100 x 100个单元,对应于5米x 5米的物理世界 障碍物在位置(x,y)处重新随机生成了具有随机半径r的圆盘,如下所示: 我需要把这个(上面的)图像转
figsize=(5,5)
创建填充有障碍物的matplotlib图形,并使用dpi=20
以bmp格式保存图像,最后将bmp图像导入numpy数组。唉,matplotlib不支持bmp。如果我使用plt.savefig('map.jpg',dpi=20,quality=100)
或其他格式以jpeg格式保存图像,则单元格的边界将变得模糊并流入其他单元格。如图所示:
所以我的问题是:如何从matplotlib保存缩小的图像,以保持图像的单元格清晰度(类似于
bmp
)尼斯哈克。但是,我宁愿显式地计算与离散化圆对应的布尔掩码。获取此类布尔映射的一种简单方法是使用matplotlib美工人员的包含点
方法,例如圆
面片
#!/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()
如果我理解正确,我认为这可以用PIL很简单地做到,特别是用
Image.resize
功能。例如,这是否符合您的要求:
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image, ImageDraw
# Make a dummy image with some black circles on a white background
image = Image.new('RGBA', (1000, 1000), color="white")
draw = ImageDraw.Draw(image)
draw.ellipse((20, 20, 180, 180), fill = 'black', outline ='black')
draw.ellipse((500, 500, 600, 600), fill = 'black', outline ='black')
draw.ellipse((100, 800, 250, 950), fill = 'black', outline ='black')
draw.ellipse((750, 300, 800, 350), fill = 'black', outline ='black')
image.save('circles_full_res.png')
# Resize the image with nearest neighbour interpolation to preserve grid sharpness
image_lo = image.resize((100,100), resample=0)
image_lo.save("circles_low_res.png")
保存一个png怎么样?我用
png
格式得到了类似的结果。但是png
文件的大小小于jpg
文件的大小。感谢您对该脚本的保密!我用这个脚本得到的结果似乎很相似:请看一看这个:让我知道你的想法。我认为这是因为压缩bmp
同时未压缩,可以保留像素边界清晰度。清洁!你确实解决了原来的问题。谢谢你的学习+1在接受这个答案之前,我将等待一段时间,看看是否有解决问题的答案。