2013-03-11 11 views
21

Ho una serie di punti che formano una forma (polilinea chiusa). Ora voglio copiare/ritagliare tutti i pixel da qualche immagine all'interno di questa forma, lasciando il resto nero/trasparente. Come faccio a fare questo?NumPy/OpenCV 2: come posso ritagliare una regione non rettangolare?

Per esempio, ho questo:

enter image description here

e voglio ottenere questo:

enter image description here

+0

Credo che vorrai lavorare con un ROI irregolare (regione di interesse). Si potrebbe iniziare qui: http://stackoverflow.com/questions/10632195/define-image-roi-with-opencv-in-c –

+0

Nel caso in cui: questa domanda non è duplicata, dal momento che si parla di API C e non di Python (quella domanda è ancora utile, però). – ffriend

risposta

34

* Modifica - aggiornato per lavorare con le immagini che hanno un canale alfa.

questo ha funzionato per me:

  • fare una maschera con tutto nero (tutto mascherato)
  • Riempire un poligono con il bianco a forma del ROI
  • combinare la maschera e l'immagine per ottenere il ROI con il nero ovunque altrove

Probabilmente si desidera mantenere l'immagine e la maschera separate per le funzioni che accettano le maschere. Tuttavia, credo che faccia ciò che hai chiesto specificamente:

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) 
+0

Perfetto! Grazie! – ffriend

+0

@kobejohn per creare una maschera per rendere lo sfondo trasparente con questo raccolto? – kju

+0

@ kju vuoi dire che vuoi trasparente anziché nero al di fuori del ROI? – KobeJohn

Problemi correlati