2013-03-23 62 views
75

Come posso ritagliare immagini, come ho fatto prima in PIL, usando OpenCV.Come ritagliare un'immagine in OpenCV usando Python

esempio Lavorare sul PIL

im = Image.open('0.png').convert('L') 
im = im.crop((1, 1, 98, 33)) 
im.save('_0.png') 

Ma come posso farlo su OpenCV?

Questo è quello che ho provato:

im = cv.imread('0.png', cv.CV_LOAD_IMAGE_GRAYSCALE) 
(thresh, im_bw) = cv.threshold(im, 128, 255, cv.THRESH_OTSU) 
im = cv.getRectSubPix(im_bw, (98, 33), (1, 1)) 
cv.imshow('Img', im) 
cv.waitKey(0) 

Ma non funziona.

Penso di aver utilizzato in modo errato getRectSubPix. Se questo è il caso, si prega di spiegare come posso usare correttamente questa funzione.

risposta

209

È molto semplice. Usa affettamento numpy.

import cv2 
img = cv2.imread("lenna.png") 
crop_img = img[y:y+h, x:x+w] 
cv2.imshow("cropped", crop_img) 
cv2.waitKey(0) 
+6

Hmm ... Ma come posso salvare l'immagine di ritaglio in variabile? – Nolik

+38

Hm, vorrei aver scelto valori diversi per l'affettatura, poiché non è ovvio se la sintassi è img [x: y, x + w: y + h] o img [y: y + h, x: x + w] – davidgoli

+27

Come servizio per i futuri utenti: "Forniamo innanzitutto le coordinate di partenza e di fine, seguite dalle coordinate di partenza e di fineX per la sezione". quindi [Y1: Y2, X1: X2] Non riuscivo a capire perché i miei raccolti stavano uscendo stranamente; ma la seconda parte non è larghezza: altezza, è X1: X2 http://www.pyimagesearch.com/2014/01/20/basic-image-manipulations-in-python-and-opencv-resizing-scaling -rotating-and-cropping – jmhead

58

ho avuto questo problema e trovato un'altra risposta qui: copy region of interest

Se consideriamo (0,0) come alto a sinistra dell'immagine chiamato im con da sinistra a destra come x la direzione e top- verso il basso come direzione y. e noi abbiamo (x1, y1) come vertice alto a sinistra e (x2, y2) come il vertice in basso a destra di una regione rettangolare all'interno di tale immagine, quindi:

roi = im[y1:y2, x1:x2] 

qui è una risorsa completa su numpy array indexing and slicing che può dirti di più su cose come ritagliare una parte di un'immagine. le immagini verrebbero archiviate come array numpy in opencv2.

:)

Problemi correlati