从NumPy数组中绘制一条线

7
我一直在四处寻找,但尚未找到解决方案,所以我要在这里询问。我有一个脚本,它创建了一个大的numpy坐标点数组(约10^8个点),然后我想使用这些坐标绘制一条折线。 PIL的ImageDraw.line对于常规列表有效,但使用numpy数组时似乎存在问题。
目前我的解决方法如下:
image = Image.new('RGB', (2**12, 2**12), 'black')
draw = ImageDraw.Draw(image, 'RGB')
draw.line(pos.tolist(), fill = '#00ff00')

其中pos是包含所有点的大型numpy数组,顺序如下:[x0,y0,x1,y1,...](如果需要可以更改)。程序最耗时的部分是pos.tolist(),约占运行时间的75%。

有没有一种方法可以画出一条线并将其保存为图像,并将其保留为numpy数组? 我只想要一个简单的图像,除了线和黑色背景之外没有其他内容。


你是否考虑在绘制之前简化线条?也许通过简单的抽稀(显然要考虑(x0,y0,x1,y1...)格式),可以大大加快你的例程速度。 - lgsp
1个回答

1
列表转换可以使用以下方式替换为float32转换
draw.line(pos.astype(np.float32), fill='#00ff00')

如果你在形成一个点的数组时,显式地将类型指定为np.float32,并且所有与其交互的数组也都是这个类型,那么通常可以摆脱类型转换。

pos = np.ones((2**8, 2), dtype=np.float32).reshape(-1)
pos *= np.random.randint(0, 2**12-1, size=(2**8, 2)).reshape(-1)
image = Image.new('RGB', (2**12, 2**12), 'black')
draw = ImageDraw.Draw(image, 'RGB')
draw.line(pos, fill='#00ff00')

应该会很好地运作。

1
感谢您在回答我8年前提出的问题时所做的努力。虽然我必须承认,我不再积极地使用这段代码了。 - maxb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接