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

时间:2019-05-24 04:22:27

标签: python matplotlib roi

我刚接触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之前我得到了此图像: enter image description here

这是在获得投资回报率之后的结果: enter image description here

我希望mask数组仅返回4个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  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]]

但是它返回了12个False值。同样,如果我将ROI绘制得更大,我将返回更多的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  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之间是否缺少特定的交互作用?

谢谢!

1 个答案:

答案 0 :(得分:0)

对于像我一样感到困惑的其他人(没有清楚地阅读文档),我通过如下修改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