L'intensité de normalisation de l'image à l'aide de Python+PIL - des problèmes de Vitesse de

Je suis en train de travailler sur un petit problème dans mon sparetime, comprenant l'analyse de certaines images obtenues à l'aide d'un microscope. C'est une gaufre avec quelques trucs ici et là, et, finalement, je veux faire un programme pour détecter lorsque certains matériaux.

De toute façon, la première étape consiste à normaliser l'intensité dans l'image, étant donné que la lentille ne donne pas l'uniforme de la foudre. Actuellement, je utiliser une image, avec un pas de trucs, seul le substrat, comme un arrière-plan ou de référence, de l'image. J'ai trouver le maximum de trois (intensité) les valeurs de RVB.

from PIL import Image
from PIL import ImageDraw
rmax = 0;gmax = 0;bmax = 0;rmin = 300;gmin = 300;bmin = 300
im_old = Image.open("test_image.png")
im_back = Image.open("background.png")
maxx = im_old.size[0] #Import the size of the image
maxy = im_old.size[1]
im_new = Image.new("RGB", (maxx,maxy))
pixback = im_back.load()
for x in range(maxx):
for y in range(maxy):
if pixback[x,y][0] > rmax:
rmax = pixback[x,y][0]
if pixback[x,y][1] > gmax:
gmax = pixback[x,y][1]
if pixback[x,y][2] > bmax:
bmax = pixback[x,y][2]
pixnew = im_new.load()
pixold = im_old.load()
for x in range(maxx):
for y in range(maxy):
r = float(pixold[x,y][0]) / ( float(pixback[x,y][0])*rmax )
g = float(pixold[x,y][1]) / ( float(pixback[x,y][1])*gmax )
b = float(pixold[x,y][2]) / ( float(pixback[x,y][2])*bmax )
pixnew[x,y] = (r,g,b)

La première partie du code qui détermine le maximum d'intensité de ROUGE, de VERT et de BLEU, pixel par pixel, de l'image d'arrière-plan, mais il doit être fait une seule fois.

La deuxième partie prend les images "réelles" (avec des trucs sur elle), et normalise le ROUGE, le VERT et le BLEU, pixel par pixel, en fonction de l'arrière-plan. Cela prend un certain temps, de 5 à 10 secondes pour une 1280x960 image, qui est trop lent si j'en ai besoin pour ce faire de plusieurs images.

Que puis-je faire pour améliorer la vitesse? J'ai pensé à déplacer toutes les images de tableaux numpy, mais je n'arrive pas à trouver un moyen rapide de le faire pour les images RVB.
Je préfère ne pas l'éloigner de python, depuis mon C++ est assez bas niveau, et d'obtenir un travail code FORTRAN serait probablement prendre plus de temps que je ne pourrais jamais enregistrer en termes de vitesse 😛

C'est probablement ce qui appartient à codereview.stackexchange.com plus qu'ici.
Je pense que c'est une zone grise. La question est au sujet d'une technologie spécifique, après tout.
Rançon: Comment "technologie spécifique" gris? C'est le code. Pour être examiné.
peut-être que vous avez raison, il n'est pas gris, après tout. Je viens de re-lire la FAQ et je ne vois pas un seul problème avec cette question.
avez-vous pensé à OpenCV? C'est un puissant traitement de l'image de la bibliothèque avec des bindings Python. Il est rapide avec la lecture et l'écriture, et a, par exemple, un adaptiveThreshold algorithme.

OriginalL'auteur Happy | 2011-09-14