Подтвердить что ты не робот

NumPy/OpenCV 2: как обрезать непрямоугольную область?

У меня есть набор точек, которые образуют форму (замкнутая полилиния). Теперь я хочу скопировать/обрезать все пиксели из некоторого изображения внутри этой фигуры, оставив остальное черным/прозрачным. Как мне это сделать?

Например, у меня есть это:

enter image description here

и я хочу это сделать:

enter image description here

4b9b3361

Ответ 1

* edit - обновлено для работы с изображениями, имеющими альфа-канал.

Это сработало для меня:

  • Создайте маску со всеми черными (все в масках)
  • Заполните многоугольник белым цветом в форме вашего ROI.
  • объедините маску и изображение, чтобы получить ROI с черным везде.

Вероятно, вы просто хотите сохранить изображение и маску отдельно для функций, которые принимают маски. Тем не менее, я считаю, что это делает то, что вы специально просили:

import cv2
import numpy as np

# original image
# -1 loads as-is so if it will be 3 or 4 channel as the original
image = cv2.imread('image.png', -1)
# mask defaulting to black for 3-channel and transparent for 4-channel
# (of course replace corners with yours)
mask = np.zeros(image.shape, dtype=np.uint8)
roi_corners = np.array([[(10,10), (300,300), (10,300)]], dtype=np.int32)
# fill the ROI so it doesn't get wiped out when the mask is applied
channel_count = image.shape[2]  # i.e. 3 or 4 depending on your image
ignore_mask_color = (255,)*channel_count
cv2.fillPoly(mask, roi_corners, ignore_mask_color)
# from Masterfool: use cv2.fillConvexPoly if you know it convex

# apply the mask
masked_image = cv2.bitwise_and(image, mask)

# save the result
cv2.imwrite('image_masked.png', masked_image)