5

Ho una cartella piena di immagini con ogni immagine contenente almeno 4 immagini più piccole. Vorrei sapere come posso tagliare le immagini più piccole usando Python PIL in modo che possano esistere tutti come file di immagine indipendenti. fortunatamente c'è una costante, lo sfondo è bianco o nero, quindi quello di cui ho bisogno è un modo per ritagliare queste immagini cercando le righe o preferibilmente le colonne completamente nere o completamente bianche. Ecco un esempio di immagine :Immagini con ritaglio automatico con PIL

enter image description here

dall'immagine qui sopra, ci sarebbero 10 immagini separati, ciascuno contenente un numero. Grazie in anticipo.

MODIFICA: Ho un'altra immagine di esempio che è più realistica nel senso che gli sfondi di alcune delle immagini più piccole hanno lo stesso colore dello sfondo dell'immagine in cui sono contenuti. Ad es.

enter image description here

L'uscita delle quali è di 13 immagini separate, ciascuna containng 1 lettera

+0

Una domanda simile su ritaglio viene chiesto prima ... http://stackoverflow.com/questions/1076638/trouble-using-python-pil-library-to-crop-and-save-image puoi mettere quel codice in un loop con le coordinate corrette che cambiano per farlo funzionare come autoprop – AurA

+0

Grazie per la risposta, ma il cropbox funziona da pred x ristretto, y coords. Come ho affermato, l'unica costante è il colore di sfondo che lascia intere colonne di nero/bianco. Sarebbe più rapido farlo manualmente rispetto a quello che sarebbe in questo modo. –

+0

inserire sotto un loop e incrementare uniformemente le coordinate in modo sostanziale la coordinata sinistra, in questo modo spero sia più veloce dell'intervento manuale, anche una volta che il codice è pronto è possibile applicarlo a n numero di immagini. – AurA

risposta

1

Utilizzando scipy.ndimage per l'etichettatura:

import numpy as np 
import scipy.ndimage as ndi 
import Image 

THRESHOLD = 100 
MIN_SHAPE = np.asarray((5, 5)) 

filename = "eQ9ts.jpg" 
im = np.asarray(Image.open(filename)) 
gray = im.sum(axis=-1) 
bw = gray > THRESHOLD 
label, n = ndi.label(bw) 
indices = [np.where(label == ind) for ind in xrange(1, n)] 
slices = [[slice(ind[i].min(), ind[i].max()) for i in (0, 1)] + [slice(None)] 
      for ind in indices] 
images = [im[s] for s in slices] 
# filter out small images 
images = [im for im in images if not np.any(np.asarray(im.shape[:-1]) < MIN_SHAPE)] 
+0

Grazie Nicolas, il codice sopra funziona alla grande sul primo esempio di immagine, purtroppo posso Sembra che lo modifichiamo per funzionare con la seconda immagine che non ho aggiunto da molto tempo.Qualsiasi consiglio sarebbe apprezzato. Grazie. –