5

Mam folder pełen obrazów z każdym obrazem zawierającym co najmniej 4 mniejsze obrazy. Chciałbym wiedzieć, jak wyciąć mniejsze obrazy za pomocą Python PIL, tak aby wszystkie one istniały jako niezależne pliki obrazów. na szczęście jest jedna stała, tło jest białe lub czarne, więc to, co domyślam się, że potrzebuję, to sposób na wycięcie tych obrazów przez wyszukanie wierszy lub najlepiej kolumn, które są całkowicie czarne lub całkowicie białe, Oto przykładowy obraz :Automatyczne przycinanie obrazów za pomocą PIL

enter image description here

z powyższego obrazu, nie byłoby 10 oddzielne obrazy, z których każda zawiera numer. Z góry dziękuję.

EDYCJA: Mam inny przykładowy obraz, który jest bardziej realistyczny w tym sensie, że tła niektórych mniejszych obrazów są tego samego koloru co tło obrazu, w którym się znajdują.

enter image description here

którego wyjście jest 13 odrębnych obrazów, każdy containng 1 list

+0

Podobne pytanie na kadrowanie proszony jest przed ... http://stackoverflow.com/questions/1076638/trouble-using-python-pil-library-to-crop-and-save-image - możesz umieścić ten kod w pętli z poprawnymi współrzędnymi, które zmieniają się, aby działały jak autopodpowiedź – AurA

+0

Dzięki za odpowiedź, ale The cropbox działa z pred efined x, y coords. Jak stwierdziłem, jedyną stałą jest kolor tła pozostawiając całe kolumny czerni/bieli. Byłoby to szybciej zrobić to ręcznie, niż byłoby to zrobić w ten sposób. –

+0

wstawić pod pewną pętlą i zwiększać współrzędne równomiernie w zasadzie o lewą współrzędną, w ten sposób mam nadzieję, że jest szybsza niż ręczna interwencja, również gdy kod jest gotowy, można zastosować go do liczby obrazów. – AurA

Odpowiedz

1

Korzystanie scipy.ndimage do etykietowania:

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

Dzięki Nicolas, powyższy kod działa świetnie na pierwszym przykładowym obrazie, niestety mogę " Wygląda na to, że dostosowuję go do pracy z drugim obrazem, którego nie dodałem długo. Każda rada byłaby doceniana. –

Powiązane problemy