5

Tengo una carpeta llena de imágenes con cada imagen que contiene al menos 4 imágenes más pequeñas. Me gustaría saber cómo puedo cortar las imágenes más pequeñas usando Python PIL para que todas existan como archivos de imagen independientes. Afortunadamente, hay una constante, el fondo es blanco o negro, así que lo que supongo que necesito es una forma de cortar estas imágenes buscando filas o preferiblemente columnas que son completamente negras o completamente blancas. Aquí hay una imagen de ejemplo :Recorte automático de imágenes con PIL

enter image description here

Partiendo de esta imagen, no habría 10 imágenes separadas, cada una contiene un número. Gracias por adelantado.

EDIT: Tengo otra imagen de muestra que es más realista en el sentido de que los fondos de algunas de las imágenes más pequeñas son del mismo color que el fondo de la imagen en la que están contenidos, p.

enter image description here

La salida de los cuales es de 13 imágenes separadas, cada una containng 1 letra

+0

Una pregunta similar en los cultivos se preguntó antes ... http://stackoverflow.com/questions/1076638/trouble-using-python-pil-library-to-crop-and-save-image puedes poner ese código en un bucle con las coordenadas correctas que cambian para que funcione como autocrop – AurA

+0

Gracias por la respuesta pero The cropbox funciona desde pred x coordinados, y coords. Como dije, la única constante es el color de fondo dejando columnas enteras de negro/blanco. Sería más rápido hacerlo manualmente de lo que sería hacerlo de esa manera. –

+0

poner debajo de un bucle e incrementar las coordenadas uniformemente básicamente la coordenada izquierda, de esa manera espero que sea más rápido que la intervención manual, también una vez que el código está listo puede aplicarlo a n número de imágenes. – AurA

Respuesta

1

Usando scipy.ndimage para el etiquetado:

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

Gracias Nicolas, el código anterior funciona muy bien en la primera imagen de ejemplo, desafortunadamente no puedo ' Parece que lo modifico para que funcione con la segunda imagen que no agregué hace mucho tiempo. Cualquier consejo sería apreciado. Gracias. –

Cuestiones relacionadas