2012-11-29 6 views
7

ho questo contorno ottenuto con matplotlib:Convert contorno (matplotlib o OpenCV) per l'immagine della stessa dimensione dell'originale

Contour

Ora, voglio usarlo come immagine di normale Python (PIL o array), perché voglio applicarlo con una maschera (ottenuta con OpenCV).

Il problema è che con MatplotLib, l'immagine con il contorno viene ridimensionata e viene aggiunto un margine (per l'asse, anche se non disegno l'asse), quindi l'immagine che ottengo dalla figura di MatplotLib non si adatta alla maschera ottenuta con OpenCV.

Ho cercato di ottenere lo stesso contorno con OpenCV, ma non ottengo alcun risultato con le funzioni cv2.FindContours e cv2.DrawContours (se sai come farlo in questo modo, per favore dimmi ... in questo previous topic è possibile vedere l'immagine originale e il contorno che voglio)

Un'altra possibile soluzione sarebbe quella di convertire il contorno ottenuto con MatplotLib in un'immagine (PIL o array) con le stesse dimensioni dell'originale, e senza margini.

Spero che tu possa aiutarmi almeno con una di queste soluzioni!

--------------------------- MODIFICA ------------------ ---------

Rutger La risposta di Kassies è giusta. Non stava lavorando per me, perché ho scritto questa linea ...

ax = plt.axes([0, 0, 1, 1], frame_on=False, xticks=[], yticks=[]) 

... dopo aver utilizzato la funzione di contorno, e deve essere prima di utilizzare la funzione di contorno. Tienilo a mente!

risposta

4

Una volta ho postato la domanda su come è possibile tracciare un'immagine con .imshow e salvarla di nuovo in modo che equivalesse all'immagine di input. I respons ho ottenuto potrebbe essere utile nel vostro caso, questo è il modo è possibile salvare l'immagine contour'ed con le stesse dimensioni:

from PIL import Image 

im = np.array(Image.open('input_image.jpg').convert('L')) 

xpixels = im.shape[1] 
ypixels = im.shape[0] 

dpi = 72 
scalefactor = 1 

xinch = xpixels * scalefactor/dpi 
yinch = ypixels * scalefactor/dpi 

fig = plt.figure(figsize=(xinch,yinch)) 

ax = plt.axes([0, 0, 1, 1], frame_on=False, xticks=[], yticks=[]) 

contour(im, levels=[240], colors='black', origin='image') 

plt.savefig('same_size.png', dpi=dpi) 
+0

Sarebbe stile meglio utilizzare l'interfaccia OO, piuttosto che l'interfaccia macchina statale. cioè 'c = ax.contour (...)' e 'fig.savefig (...)' – tacaswell

+0

Concordo pienamente, lo stile OO è decisamente migliore. Questo codice era fondamentalmente una modifica del codice nel post "precedente" menzionato in cui intendevo rimanere il più vicino possibile al codice originale. –

+0

@Rutger Kassies, grazie per la tua risposta. Per favore, vedi la mia modifica nella domanda. Non so perché c'è ancora un margine. – Xithias

Problemi correlati