Точка в многоугольнике в массиве NumPy - PullRequest
0 голосов
/ 25 октября 2019

Я использую лыжный маг. Мне нужно создать маску, равную по площади изображению. Маска будет иметь область, которая будет скрывать часть изображения. Я строю это, как в примере ниже, но это очень медленно, и я уверен, что есть питонский способ сделать это. Может ли кто-нибудь выделить это, пожалуйста?

Код использую сейчас:

import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import skimage as sk

sourceimage = './sample.jpg'

img = np.copy(io.imread(sourceimage, as_gray=True))

mask = np.full(img.shape, 1)
maskpolygon = [(1,200),(300,644),(625,490),(625,1)]

from shapely.geometry import Point
from shapely.geometry.polygon import Polygon

pgon = Polygon(maskpolygon)
for r in range(mask.shape[0]):
    for c in range(mask.shape[1]):
        p = Point(r,c)
        if pgon.contains(p):
            mask[r,c] = 0

Ожидаемый результат похож (для изображения 9x9 - но я работаю на 700x700)

[1,1,1,1,1,1,1,1,1]
[1,1,1,1,1,1,1,1,1]
[1,1,0,0,1,1,1,1,1]
[1,1,0,0,1,1,1,1,1]
[1,1,0,0,0,0,1,1,1]
[1,1,0,0,0,0,0,1,1]
[1,1,1,0,0,0,0,1,1]
[1,1,1,1,0,0,1,1,1]
[1,1,1,1,1,1,1,1,1]

Я могу инвертировать 1и 0, чтобы показать / скрыть регион.

Спасибо.

1 Ответ

1 голос
/ 25 октября 2019

Мне удалось решить эту проблему благодаря @ HansHirse.

Ниже описано, как я с этим справился

sourceimage = './sample.jpg'
figuresize = (100, 100)

from skimage.draw import polygon

#open source and create a copy
img = np.copy(io.imread(sourceimage, as_gray=True))

mask = np.full(img.shape, 0)
maskpolygon = [(1,1), (280,1),(625, 280),(460, 621),(15, 625)]

maskpolygonr = [x[0] for x in maskpolygon]
maskpolygonc = [x[1] for x in maskpolygon]
rr, cc = polygon(maskpolygonr, maskpolygonc)
mask[rr ,cc] = 1

masked_image = img * mask

# show step by step what is happening
fig, axs = plt.subplots(nrows = 3, ncols = 1, sharex=True, sharey = True, figsize=figuresize )

ax = axs.ravel()

ax[0].imshow(img)#, cmap=plt.cm.gray)
ax[1].imshow(mask)#, cmap=plt.cm.gray)
ax[2].imshow(masked_image)#, cmap=plt.cm.gray)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...