Jupyter笔记本:允许用户输入绘图

10

这是一个简单的问题,但我找不到相关的工具...

是否有一个简单易用的工具,可以在 jupyter-notebook 中让用户在白色空间上绘制黑色东西(假设大小为 (x,y) 像素),并在运行单元格后返回(或者暂时保存)作为一个数组/图像,然后可以由 numpy 等使用。


也许可以调整holoviews库来实现这个功能。 - edinho
3个回答

7

您可以使用 PILtkinter 库来完成,例如:

from PIL import ImageTk, Image, ImageDraw
import PIL
from tkinter import *

width = 200  # canvas width
height = 200 # canvas height
center = height//2
white = (255, 255, 255) # canvas back

def save():
    # save image to hard drive
    filename = "user_input.jpg"
    output_image.save(filename)

def paint(event):
    x1, y1 = (event.x - 1), (event.y - 1)
    x2, y2 = (event.x + 1), (event.y + 1)
    canvas.create_oval(x1, y1, x2, y2, fill="black",width=5)
    draw.line([x1, y1, x2, y2],fill="black",width=5)

master = Tk()

# create a tkinter canvas to draw on
canvas = Canvas(master, width=width, height=height, bg='white')
canvas.pack()

# create an empty PIL image and draw object to draw on
output_image = PIL.Image.new("RGB", (width, height), white)
draw = ImageDraw.Draw(output_image)
canvas.pack(expand=YES, fill=BOTH)
canvas.bind("<B1-Motion>", paint)

# add a button to save the image
button=Button(text="save",command=save)
button.pack()

master.mainloop()

您可以修改save函数,使用PILnumpy来读取图像并将其作为numpy数组。希望这能帮到您!

不错,它有所帮助,没错。但是如果画得太快,线条会出现虚点,这不是我想要的。我还修复了一些小错误,并使用黑白模式导出图像,因为我不需要3个通道(我在代码中添加了PIL.image.new()文档URL以获取所有可用模式)。 - swiss_knight
是的,我在编写代码时也注意到了同样的问题,我无法找到改变它的方法,目前我能想到的唯一解决方案是在绘图时慢慢移动鼠标,请务必告诉我如果你发现了任何解决方法。@s.k - Mohammed Janati Idrissi
这个在云笔记本上运行应该可以吗?我收到了“TclError:没有显示名称和没有$DISPLAY环境变量”的错误。 - MemoryWrangler

2

尝试使用ipycanvas进行交互式绘图。 它实际上有一个演示笔记本,其中包含可以轻松修改以完全符合您要求的交互式绘图。它还支持numpy。


0

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