Método mais rápido para ajustar valores de pixel PIL

Estou escrevendo um script para chroma key (tela verde) e compondo alguns vídeos usando Python e PIL (travesseiro). Eu posso digitar as imagens de 720p, mas ainda resta algum respingo verde. Compreensível, mas estou escrevendo uma rotina para remover esse derramamento ... no entanto, estou lutando com o tempo que está demorando. Provavelmente, posso obter velocidades melhores usando truques entorpecidos, mas não estou familiarizado com isso. Alguma ideia?

Aqui está minha rotina desagradável. É preciso uma imagem PIL e um número de sensibilidade, mas estou deixando isso em 1 até agora ... está funcionando bem. Estou chegando em pouco mais de 4 segundos para um quadro de 720p remover esse derramamento. Para comparação, a rotina chroma key é executada em cerca de 2 segundos por quadro.

def despill(img, sensitivity=1):
    """
    Blue limits green.
    """
    start = time.time()
    print '\t[*] Starting despill'
    width, height = img.size
    num_channels = len(img.getbands())
    out = Image.new("RGBA", img.size, color=0)
    for j in range(height):
        for i in range(width):
            #r,g,b,a = data[j,i]
            r,g,b,a = img.getpixel((i,j))
            if g > (b*sensitivity):
                out_g = (b*sensitivity)
            else:
                out_g = g
            # end if

            out.putpixel((i,j), (r,out_g,b,a))
        # end for
    # end for
    out.show()
    print '\t[+] done.'
    print '\t[!] Took: %0.1f seconds' % (time.time()-start)
    exit()
    return out
# end despill

Em vez de putpixel, tentei escrever os valores dos pixels de saída em uma matriz numpy e depois converter a matriz em uma imagem PIL, mas isso estava em média em pouco mais de 5 segundos ... então isso era mais rápido de alguma forma. Eu sei que o putpixel não é a opção mais rápida, mas estou perdido ...

questionAnswers(1)

yourAnswerToTheQuestion