2015-05-31 2 views
0

Я обрабатываю несколько сотен изображений, разрезая их автоматически на определенной высоте и вставляя куски один за другим. Я создаю новый экземпляр Image с new с более высоким размером, чем в последний раз, чтобы освободить место для нового фрагмента. Когда процессия выполняется, конечный результат сохраняется в файле.Как вставить кусок изображений один за другим эффективно?

Моя проблема прямо сейчас в том, что этот подход заключается в том, что он потребляет много оперативной памяти и свопа, почти замораживая мой компьютер. Есть ли способ достичь моей цели, не потребляя много оперативной памяти? до сих пор, это код, у меня есть:

import SimpleCV as cv 
import argparse 
import PIL 
from os.path import join, abspath 

parser = argparse.ArgumentParser(
    description=("Process many images and paste the chunks into a final image")) 
# ...code removed for brevity... 
argv = parser.parse_args() 
rango_inicio = int(argv.rango.split(":")[0]) 
rango_fin = int(argv.rango.split(":")[1]) 

img = None 

for pag in xrange(rango_inicio, rango_fin + 1): 
    numero = format(pag, '0' + argv.relleno) 
    pagina = join(
     argv.dir_entrada, argv.prefijo + numero + '.' + argv.extension) 
    pagina = abspath(pagina) 
    print(pagina) 
    imagen = cv.Image(pagina) 
    fs = sorted(imagen.findLines(), key=lambda f: f.width())[-1] 
    if fs.width() >= 598: 
     cropped = imagen.crop(0, fs.y, imagen.width, imagen.height) 
     if not img: 
      img = PIL.Image.new("RGB", (cropped.width, cropped.height)) 
      croppedraw = cropped.getPIL() 
      img.paste(croppedraw, (0, 0)) 
     else: 
      croppedraw = cropped.getPIL() 
      imgtmp = img.copy() 
      img = PIL.Image.new(
       "RGB", (imgtmp.size[0], imgtmp.size[1] + cropped.height)) 
      img.paste(imgtmp, (0, 0)) 
      img.paste(croppedraw, (0, imgtmp.size[1])) 

# and save the final image 

ответ

0

Вы первый загрузка изображений в CV, а затем и составление списка каждой строки в изображении в виде списка, по-видимому, только найти его ширина, то вы обрезать его, а затем вы сделаете из него изображение PIL.

Я думаю, вы можете сделать все это прямо в PIL, что означает, что вам нужна только одна копия файла в памяти, что делает это лучше.

Сказанное не должно меняться в любом случае, если у вас нет серьезных изображений, так как каждое изображение должно быть собрано в мусор, как только вы загрузили новое изображение в память, так что может возникнуть другая проблема.

Смежные вопросы