Я довольно новичок в Python и застрял в проблеме ...
Я пытаюсь нарисовать область интереса (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:
Я ожидал, что массив масок вернет только 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]]
Но вместо этого он вернул 12 ложных значений. Также, если бы я рисовал ROI еще больше, я бы возвратил больше ложных значений.
[[ True True True True True True True True True True]
[ True True True True True True True True True True]
[ 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, которые я пропускаю?
Спасибо!