用Python实现在图片上,通过鼠标,手动绘制物体轮廓,从而获得图片中物体的mask图片...
时间: 2024-02-15 19:05:32 浏览: 125
可以使用Python的OpenCV库来实现这个功能。下面是一个简单的示例代码,可以帮助你实现手动绘制物体轮廓并获得mask图片:
```python
import cv2
import numpy as np
# 定义回调函数
def draw_mask(event, x, y, flags, param):
global drawing, ix, iy, mask
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing:
cv2.line(mask, (ix, iy), (x, y), (255, 255, 255), 5)
ix, iy = x, y
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
cv2.line(mask, (ix, iy), (x, y), (255, 255, 255), 5)
# 读取图片
img = cv2.imread('image.jpg')
# 创建一个空白的mask
mask = np.zeros(img.shape[:2], dtype=np.uint8)
# 创建窗口并绑定回调函数
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_mask)
# 实时显示图片并等待按下ESC键退出
drawing = False
while True:
cv2.imshow('image', img)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
# 根据mask生成物体的二值图
ret, thresh = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY)
# 将二值图与原始图像进行按位与操作,得到物体的mask图
mask_img = cv2.bitwise_and(img, img, mask=thresh)
# 显示物体的mask图并等待按下任意键退出
cv2.imshow('mask', mask_img)
cv2.waitKey(0)
# 释放资源
cv2.destroyAllWindows()
```
在代码中,我们首先读取一张图片,并创建一个空白的mask,用于绘制物体的轮廓。然后创建窗口,并将回调函数绑定到窗口上。回调函数会在鼠标事件发生时被调用,用于实现手动绘制物体轮廓。在回调函数中,我们使用`cv2.line()`函数绘制直线,并将mask中对应的像素设置为白色。最后,根据mask生成物体的二值图,并将二值图与原始图像进行按位与操作,得到物体的mask图。
你可以按照上述示例代码,在本地运行并尝试手动绘制物体轮廓,并获得物体的mask图片。
阅读全文