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
我是 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