请使用PIL 和 Tkinter 库实现
时间: 2023-12-26 13:03:27 浏览: 123
好的,下面是使用PIL和Tkinter库实现手动绘制物体轮廓并获得mask图片的示例代码:
```python
from PIL import Image, ImageDraw
import tkinter as tk
# 定义回调函数
def draw_mask(event):
global drawing, last_x, last_y
if drawing:
draw.line((last_x, last_y, event.x, event.y), fill='white', width=5)
last_x, last_y = event.x, event.y
def start_draw(event):
global drawing, last_x, last_y
drawing = True
last_x, last_y = event.x, event.y
def stop_draw(event):
global drawing
drawing = False
# 读取图片
img = Image.open('image.jpg')
# 创建一个空白的mask
mask = Image.new('L', img.size, 0)
# 创建画布并绑定回调函数
root = tk.Tk()
root.title('Draw Mask')
canvas = tk.Canvas(root, width=img.width, height=img.height)
canvas.pack()
draw = ImageDraw.Draw(mask)
drawing = False
canvas.bind('<B1-Motion>', draw_mask)
canvas.bind('<Button-1>', start_draw)
canvas.bind('<ButtonRelease-1>', stop_draw)
# 显示图片并等待按下ESC键退出
tk_img = ImageTk.PhotoImage(img)
canvas.create_image(0, 0, anchor='nw', image=tk_img)
root.mainloop()
# 将mask转换为二值图
mask = mask.point(lambda x: 255 if x > 0 else 0)
# 将二值图与原始图像进行按位与操作,得到物体的mask图
mask_img = Image.composite(img, Image.new('RGB', img.size, (0, 0, 0)), mask)
# 显示物体的mask图并等待按下任意键退出
mask_img.show()
```
在代码中,我们首先使用PIL库读取一张图片,并创建一个空白的mask。然后创建一个Tkinter窗口,并在窗口中显示图片。在窗口上绑定鼠标事件回调函数,用于实现手动绘制物体轮廓。在回调函数中,我们使用PIL库中的`ImageDraw`类绘制直线,并将mask中对应的像素设置为白色。最后,将mask转换为二值图,并将二值图与原始图像进行按位与操作,得到物体的mask图。
你可以按照上述示例代码,在本地运行并尝试手动绘制物体轮廓,并获得物体的mask图片。
阅读全文