我刚接触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之前我得到了此图像:
我希望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之间是否缺少特定的交互作用?
谢谢!
答案 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