NumPy/OpenCV 2: как обрезать непрямоугольную область?
У меня есть набор точек, которые делают форму (замкнутая полилиния). Теперь я хочу скопировать / обрезать все пиксели из некоторого изображения внутри этой фигуры, оставив остальное черным / прозрачным. Как мне это сделать?
Например, у меня есть это:
и я хочу получить это:
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's convex
# apply the mask
masked_image = cv2.bitwise_and(image, mask)
# save the result
cv2.imwrite('image_masked.png', masked_image)
Следующий код будет полезен для обрезки изображений и получения их на белом фоне.
import cv2
import numpy as np
# load the image
image_path = 'input image path'
image = cv2.imread(image_path)
# create a mask with white pixels
mask = np.ones(image.shape, dtype=np.uint8)
mask.fill(255)
# points to be cropped
roi_corners = np.array([[(0, 300), (1880, 300), (1880, 400), (0, 400)]], dtype=np.int32)
# fill the ROI into the mask
cv2.fillPoly(mask, roi_corners, 0)
# The mask image
cv2.imwrite('image_masked.png', mask)
# applying th mask to original image
masked_image = cv2.bitwise_or(image, mask)
# The resultant image
cv2.imwrite('new_masked_image.png', masked_image)
Входное изображение: ht tps:https://stackru.com/images/2c075c5b1fcfb5387d6f47ea9c8fdb3fb5b06383.jpg
Изображение маски: ht tps:https://stackru.com/images/15c269ebb63418f632fc6ba90b7ea276952fab21.png
Результирующее выходное изображение: ht tps:https://stackru.com/images/17b3b47b4b3a2fb0d93b2a751375bd60283686b0.png