用Python实现在图片上,通过鼠标,手动绘制物体轮廓,从而获得图片中物体的mask图片
时间: 2023-09-20 10:05:47 浏览: 275
Python 实现图像的手绘效果
### 回答1:
可以使用 Python 的图像处理库 PIL 和 Tkinter 来实现。首先,使用 PIL 读入原始图片,然后使用 Tkinter 创建一个图形界面,在界面中显示读入的图片。然后,使用 Tkinter 中的鼠标事件,记录鼠标移动的轨迹,并在界面上绘制出来。最后,使用 PIL 将绘制的轮廓信息转换为 mask 图片。
以下是一个简单的例子,展示了如何使用 Tkinter 在图片上绘制红色的线条:
```
from PIL import Image, ImageTk
import tkinter as tk
# 读入图片
image = Image.open('image.jpg')
# 创建 Tkinter 窗口
root = tk.Tk()
# 将图片用 ImageTk 包装
image_tk = ImageTk.PhotoImage(image)
# 创建一个 Label,显示图片
label = tk.Label(root, image=image_tk)
label.pack()
# 创建一个 Canvas,在图片上绘制
canvas = tk.Canvas(label, width=image.width, height=image.height)
canvas.pack()
# 在 Canvas 上绘制红色的线条
line = canvas.create_line(0, 0, 100, 100, fill='red')
root.mainloop()
```
希望这个例子能够给你一些启发。
### 回答2:
要通过Python实现在图片上手动绘制物体轮廓并获取物体的mask图像,可以借助Python的OpenCV库和鼠标事件。
首先,导入所需的库和模块:
```python
import cv2
import numpy as np
```
然后,定义一些全局变量来追踪鼠标事件和绘制轮廓:
```python
drawing = False # 鼠标绘制状态
ix, iy = -1, -1 # 起始坐标
mask = None # 创建mask图像
```
接下来,定义鼠标事件的回调函数,用于追踪鼠标位置和绘制轮廓:
```python
def draw_contour(event, x, y, flags, param):
global ix, iy, drawing, mask
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
cv2.line(mask, (ix, iy), (x, y), 255, 2)
cv2.line(frame, (ix, iy), (x, y), (0, 0, 255), 2)
```
然后,加载图像,并创建与图像大小相同的黑色mask图像:
```python
image = cv2.imread('image.jpg')
frame = image.copy()
mask = np.zeros(image.shape[:2], dtype=np.uint8)
```
接着,创建一个窗口,并将回调函数与窗口绑定:
```python
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_contour)
```
最后,循环显示图像,直到按下"esc"键退出窗口:
```python
while True:
cv2.imshow('image', frame)
if cv2.waitKey(1) == 27:
break
cv2.destroyAllWindows()
```
当按下"esc"键退出窗口后,可以得到一个绘制了物体轮廓的mask图像。可以将之保存为图片:
```python
cv2.imwrite('mask.jpg', mask)
```
这样,你就用Python实现了通过鼠标手动绘制物体轮廓,并获取图片中物体的mask图像。
### 回答3:
实现在图片上通过鼠标手动绘制物体轮廓并获取物体的mask图片可以通过使用Python中的OpenCV库和鼠标事件回调函数来实现。下面是一个简单的示例代码:
```python
import cv2
import numpy as np
# 定义全局变量
drawing = False # 是否正在绘制标记
mode = True # True:绘制轮廓,False:擦除轮廓
ix, iy = -1, -1
# 鼠标事件回调函数
def draw_circle(event, x, y, flags, param):
global ix, iy, drawing, mode
if event == cv2.EVENT_LBUTTONDOWN: # 鼠标左键按下时开始绘制
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_LBUTTONUP: # 鼠标左键松开时结束绘制
drawing = False
cv2.circle(img, (x, y), 3, (255, 255, 255), -1) # 标记绘制点位置
if mode:
cv2.circle(mask, (x, y), 3, (255, 255, 255), -1) # 标记mask中对应位置为前景
else:
cv2.circle(mask, (x, y), 3, (0, 0, 0), -1) # 标记mask中对应位置为背景
# 读取图片
img = cv2.imread('input.jpg')
mask = np.zeros_like(img)
# 创建窗口并绑定鼠标事件回调函数
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)
while True:
cv2.imshow('image', img)
k = cv2.waitKey(1) & 0xFF
if k == ord('m'): # 切换模式
mode = not mode
elif k == 27: # 按下Esc键退出
break
cv2.destroyAllWindows()
# 保存mask图片
cv2.imwrite('mask.jpg', mask)
```
在代码中,首先导入OpenCV库和NumPy库,然后定义了两个全局变量drawing和mode,分别表示是否正在绘制标记和当前绘制模式。在鼠标事件回调函数draw_circle中,根据不同的鼠标事件进行相应的操作,绘制或擦除标记点,并将对应位置在mask图片中标记为前景或背景。最后通过创建窗口、绑定回调函数并循环显示图片,通过按键切换模式和退出程序。最终保存绘制好的mask图片。
注意:在运行代码之前,需要准备一张名为input.jpg的图片,并确保代码和图片在同一目录下。
阅读全文