web-dev-qa-db-fra.com

NumPy / OpenCV 2: comment recadrer une région non rectangulaire?

J'ai un ensemble de points qui font une forme (polyligne fermée). Maintenant, je veux copier/recadrer tous les pixels d'une image à l'intérieur de cette forme, laissant le reste noir/transparent. Comment puis-je faire cela?

Par exemple, j'ai ceci:

enter image description here

et je veux obtenir ceci:

enter image description here

33
ffriend

* modifier - mis à jour pour fonctionner avec des images qui ont un canal alpha.

Cela a fonctionné pour moi:

  • Faire un masque avec tout noir (tout masqué)
  • Remplissez un polygone de blanc en forme de votre ROI
  • combinez le masque et votre image pour obtenir le ROI avec du noir partout ailleurs

Vous voulez probablement simplement garder l'image et le masque séparés pour les fonctions qui acceptent les masques. Cependant, je crois que cela fait ce que vous avez spécifiquement demandé:

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)
49
KobeJohn

Le code suivant serait utile pour rogner les images et les placer sur fond blanc.

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)

Image d'entrée: input image

Image du masque: mask image

Image de sortie résultante: enter image description here

0
Kanish Mathew