Как matplotlib.path.contains_points взаимодействует с PolygonSelector? - PullRequest
0 голосов
/ 24 мая 2019

Я довольно новичок в 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: enter image description here

И этот после рисования ROI: enter image description here

Я ожидал, что массив масок вернет только 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, которые я пропускаю?

Спасибо!

1 Ответ

0 голосов
/ 25 мая 2019

Для всех, кто был сбит с толку, как я (не читая документацию ясно), я решил свою проблему, изменив мою функцию 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
...