使用交互式前景提取方法,将“cup.jpg”图中的杯子作为前景提取出来plt
时间: 2023-09-20 18:10:54 浏览: 133
图像前景提取
好的,我可以使用交互式前景提取方法帮您提取“cup.jpg”中的杯子,并使用 matplotlib 库将结果显示出来。
以下是完整的代码示例:
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread("cup.jpg")
# 定义变量
rect = (0, 0, 1, 1) # 初始矩形区域
drawing = False # 是否正在绘制
mode = True # True为绘制前景,False为绘制背景
fgd = 1 # 前景标记值
bgd = 0 # 背景标记值
# 鼠标回调函数
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_MOUSEMOVE:
if drawing == True:
if mode == True:
cv2.circle(img, (x, y), 5, (0, 255, 0), -1)
else:
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv2.circle(img, (x, y), 5, (0, 255, 0), -1)
cv2.circle(mask, (x, y), 5, fgd, -1)
else:
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
cv2.circle(mask, (x, y), 5, bgd, -1)
# 创建掩模
mask = np.zeros(img.shape[:2],np.uint8)
# 创建窗口并注册鼠标事件
cv2.namedWindow("image")
cv2.setMouseCallback("image", draw_circle)
while(1):
cv2.imshow("image", img)
k = cv2.waitKey(1) & 0xFF
if k == ord("m"): # 切换模式
mode = not mode
elif k == ord("r"): # 重置标记
img = cv2.imread("cup.jpg")
mask = np.zeros(img.shape[:2],np.uint8)
elif k == 13: # 按下 Enter 键运行 GrabCut 算法
cv2.grabCut(img, mask, rect, None, None, 5, cv2.GC_INIT_WITH_MASK)
mask2 = np.where((mask==1) + (mask==3), 255, 0).astype('uint8')
res = cv2.bitwise_and(img,img,mask=mask2)
plt.imshow(cv2.cvtColor(res, cv2.COLOR_BGR2RGB))
plt.show()
break
cv2.destroyAllWindows()
```
运行代码后,会弹出一个名为“image”的窗口。您可以使用鼠标左键绘制前景,使用鼠标右键绘制背景。按下“Enter”键后,程序将会运行 GrabCut 算法并将结果使用 matplotlib 库显示出来。
请注意,这种方法可能需要多次交互才能得到准确的结果。如果您不满意结果,可以再次运行 GrabCut 算法并重新标注。
阅读全文