前景提取中的掩码值

时间:2017-07-24 10:52:56

标签: python opencv image-processing

我正在处理此代码以执行前景提取,但我不了解mask2 = np.where((mask==2 | (mask == 0), 0, 1).astype('uint8'))img = img*mask2[:, :, np.newaxis]行的含义。这是代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('tut12img.jpg')
mask = np.zeros(img.shape[:2], np.uint8)
bgdModel = np.zeros((1,65), np.float64)
fgdModel = np.zeros((1,65), np.float64)

rect = (161, 79, 150, 150)

cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask2[:, :, np.newaxis]
plt.imshow(img)
plt.colorbar()
plt.show()

为什么麝香在2或0时为零?这有什么特别之处?什么样的基质是musk2?谢谢!

代码和照片来自https://pythonprogramming.net/grabcut-foreground-extraction-python-opencv-tutorial/?completed=/template-matching-python-opencv-tutorial/

1 个答案:

答案 0 :(得分:0)

mask2是前景蒙版。所以你只使用前景像素,这是通过设置每个背景像素0来完成的,否则为1

mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')

将像素分为4类。

  • 背景(0)

  • 前景(1)

  • 可能是背景(2)

  • 可能是前景(3)

当然,如果该代码的作者使用了正确的标志,如cv2.GC_BGD而不是0,那就更明显了......

另外,mask2可能不是最具信息性的名称。

这一切都在OpenCV手册中。你所要做的就是谷歌1-2字,阅读1段...

http://docs.opencv.org/3.2.0/d7/d1b/group__imgproc__misc.html#ga909c1dda50efcbeaa3ce126be862b37f

  

掩码输入/输出8位单通道掩码。掩码初始化   通过模式设置为GC_INIT_WITH_RECT时的功能。它的元素   可能有一个cv :: GrabCutClasses。

  

enum cv :: GrabCutClasses

     

GrabCut算法中的像素类

     

GC_BGD明显的背景像素

     

GC_FGD一个明显的前景(对象)像素

     

GC_PR_BGD可能的背景像素

     

GC_PR_FGD可能的前景像素