Я пытаюсь получить определенную область (а не прямоугольник) из изображения. Из контура я смог сгенерировать все точки, содержащие эту область.
arialpoints = [[0,0],[0,1],[0,2]...]
Я просматриваю пример в opencv, который создал изображение, основанное на точках x, y координат и ширине
testimage = cv2.imread("foo.jpg")
cropped = testimage[x:x+width, y:y+height]
cv2.imwrite('final.jpg', cropped)
Но это для прямоугольной обрезанной области, я хотел бы сделать это для полигона. Есть ли способ, с помощью которого я могу генерировать testimage [x: x + width, y: y + height] из моих координат?
Позвольте мне попробовать на примере.
Скажем, у нас есть случайное изображение
np.random.seed(42)
img = np.random.randint(255, size=(10,10,3))
и список пунктов
points = np.array([[2, 2],
[3, 2],
[3, 3],
[4, 2],
[4, 3],
[5, 2],
[5, 3],
[5, 4],
[6, 5],
[7, 6]])
Вы можете создать двоичную маску для своих точек, как это (вам может потребоваться np.fliplr(points)
зависимости от того, как определены координаты x и y)
mask = np.zeros_like(img)
mask[points.T.tolist()] = 1
Теперь вы можете использовать эту маску, чтобы выбрать область изображения, которое вы хотите
img = img * mask
и вы также можете ограничить свой выбор рамкой
xmin, ymin = np.min(points, axis=0)
xmax, ymax = np.max(points, axis=0)
cropped = img[xmin:xmax+1, ymin:ymax+1]
img = np.dstack((img, 255 * np.ones((img.shape[:2]))))
(предполагая, что альфа является последним столбцом, который по умолчанию с opencv)