2013-03-11 9 views
21

Mam zestaw punktów, które tworzą kształt (zamknięta polilinia). Teraz chcę skopiować/przyciąć wszystkie piksele z jakiegoś obrazu w tym kształcie, pozostawiając resztę czarną/przezroczystą. Jak mam to zrobic?NumPy/OpenCV 2: jak przycinać region inny niż prostokątny?

Na przykład, mam to:

enter image description here

i chcę uzyskać to:

enter image description here

+0

Uważam, że będziesz chciał pracować z nieregularnym zwrotem z inwestycji (region zainteresowania). Możesz zacząć tutaj: http://stackoverflow.com/questions/10632195/define-image-roi-with-opencv-in-c –

+0

Na wszelki wypadek: to pytanie nie jest duplikatem, ponieważ polecane opisuje C API, a nie Python (to pytanie jest nadal pomocne). – ffriend

Odpowiedz

34

* edit - zaktualizowany do pracy z obrazami, które mają kanał alfa.

Ten pracował dla mnie:

  • zrobić maskę z All Black (wszystkie maskowane)
  • Fill wielokąt z białym w kształcie ROI
  • połączyć maskę i obrazu w celu uzyskania ROI z czarnym wszędzie indziej

Prawdopodobnie chcesz zachować obraz i maskę oddzielnie dla funkcji akceptujących maski. Wierzę jednak, że robi to, o co konkretnie prosiłeś:

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

Idealny! Dziękuję Ci! – ffriend

+0

@kobejohn, aby utworzyć maskę, aby uzyskać przezroczyste tło z tym przycięciem? – kju

+0

@kju masz na myśli, że chcesz przezroczysty zamiast czarnego poza ROI? – KobeJohn

Powiązane problemy