matplotlib.path.contains_points 如何与 PolygonSelector 交互?

How does matplotlib.path.contains_points interact with PolygonSelector?

我是 Python 的新手,遇到了一个问题...

我正在尝试在图像上绘制感兴趣区域 (ROI) 并计算该 ROI 中的平均像素值。

首先,我尝试了以下方法 - 首先我使用 matplotlib.widgets.PolygonSelector 绘制多边形,然后使用 path.contains_points to create 蒙版,然后我可以将其应用于原始图像。

class ROIPolygon(object):
    def __init__(self, ax, row, col):
        self.canvas = ax.figure.canvas
        self.poly = PolygonSelector(ax,
                                    self.onselect,
                                    lineprops = dict(color = 'g', alpha = 1),
                                    markerprops = dict(mec = 'g', mfc = 'g', alpha = 1))
        self.path = None

    def onselect(self, verts):
        path = Path(verts)
        self.canvas.draw_idle()
        self.path = path

def get_mask(drawn_roi, row, col):
    for i in np.arange(row):
        for j in np.arange(col):
             if drawn_roi.path.contains_points([(j,i)]) == [True]:
                 mask[i][j] = 1
    mask_bool = mask.astype(bool)
    mask_bool = ~mask_bool
    return mask_bool

但是当我在一张仅包含 4 个彩色像素的小图像上对此进行测试时,我在绘制 ROI 之前得到了这张图像:

这是在绘制 ROI 之后:

我预计掩码数组 return 只有 4 个假值。

[[ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True False False  True  True  True]
 [ True  True  True  True  True False False  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]]

而是 returned 12 False 值。同样,如果我要绘制更大的投资回报率,我会 return 更多错误值。

[[ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True False False False False  True  True]
 [ True  True  True  True False False False False  True  True]
 [ True  True  True  True False False False False  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]]

所以我想知道我的方法是否有问题,或者 PolygonSelector 和 path.contains_points 之间是否存在特定的相互作用?

谢谢!

对于像我一样感到困惑的其他人(没有清楚地阅读文档),我通过如下更改 get_mask 函数解决了我的问题:

def get_mask(img_frame, drawn_roi, row, col):
    for i in np.arange(row):
        for j in np.arange(col):
             if np.logical_and(drawn_roi.path.contains_points([(j,i)]) == [True], img_frame[i][j] > 0):
                 mask[i][j] = 1
    mask_bool = mask.astype(bool)
    mask_bool = ~mask_bool
    return mask_bool