Bonjour à tous =)

Je débute en python et me voilà confronté à un petit problème... Je vous explique le contexte : mon objectif est de faire l'équivalent d'imagesc (fonction MATLAB) en python, c'est à dire à partir d'un numpyArray réétaler la dynamique entre 0 et 255 puis lui appliquer une 'colorbar' (lue à partir d'une image tiff faisant 256*1 pixels) pour récupérer 3 numpyArray (un pour le rouge, un pour le vert et un pour le bleu) me permettant d'enregistrer mon résultat sous forme d'une image. J'ai réussi une première version mais le temps de calcul est bien trop long à mon goût et j'essaye maintenant d'optimiser mon code.

Dans un premier temps voici mon code non optimisé qui fonctionne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from PIL import Image
import numpy
 
def imagesc(data, nb_col, nb_lig, col)
   """ """
   PATH_COLOR = '/home/chemin/vers/colorbar/'
   colorbar = Image.open(PATH_COLOR+col+'.tiff', 'r'
   colorbar = colorbar.getdata()
 
   R = G = B = data
 
   min_data = numpy.ma.min(data)
   max_data = numpy.ma.max(data)
 
   j=0
   while j < nb_lig:
      k = 0
      while k < nb_col:
         i = 0
         if min_data < max_data:
            i = ((data[j][k] - min_data)/(max_data-min_data))*255
         else:
            i = 0
         i = int(numpy.around(i, decimals = 0))
 
         R[j][k] = colorbar[i][0]
         G[j][k] = colorbar[i][0]
         B[j][k] = colorbar[i][0]
         k += 1
      j += 1
 
   numpy.ma.masked_where(numpy.ma.getmask(data) == True, R)
   numpy.ma.masked_where(numpy.ma.getmask(data) == True, G)
   numpy.ma.masked_where(numpy.ma.getmask(data) == True, B)
 
   RGB = []
   RGB.append(R)
   RGB.append(G)
   RGB.append(B)
Et ma tentative d'optimisation qui ne fonctionne pas... Où j'ai essayé au maximum de mes maigres capacités de supprimer les boucles car c'est une plaie pour les temps de calcul.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from PIL import Image
import numpy
 
def imagesc(data, col)
   """ """
   PATH_COLOR = '/home/chemin/vers/colorbar/'
   colorbar = Image.open(PATH_COLOR+col+'.tiff', 'r'
   colorbar = colorbar.getdata()
 
   min_data = numpy.ma.min(data)
   max_data = numpy.ma.max(data)
 
   if min_data < max_data:
      index = numpy.around((((data - min_data)/(max_data - min_data))*255), decimals = 0)
      index = index.astype(int)
   else:
      index = data * 0.0
      index = index.astype(int)
 
   R = G = B = index
 
   for i in range(0, 256):
      R[numpy.ma.where(index == i)] = colorbar[i][0]
      G[numpy.ma.where(index == i)] = colorbar[i][1]
      B[numpy.ma.where(index == i)] = colorbar[i][2]
 
   RGB = []
   RGB.append(R)
   RGB.append(G)
   RGB.append(B)
Quand je test ça 'à la main' directement sous idle en tapant genre "i = 16" puis "R[numpy.ma.where(index == i)] = colorbar[i][0]" j'obtiens ce que je veux mais dès que je le passe dans la boucle for ça ne fonctionne plus... Je ne comprends pas pourquoi ça me modifie mon numpyArray 'index' et je me retrouve au final avec 4 array (index, R, G, et B) identique et qui ne correspondent en rien à ce que je devrais avoir.

j'ai alors essayé une autre variante que voici:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
   for i in range(0, 256):
      numpy.ma.put(R, numpy.ma.where(index == i), colorbar[i][0])
      numpy.ma.put(G, numpy.ma.where(index == i), colorbar[i][1])
      numpy.ma.put(B, numpy.ma.where(index == i), colorbar[i][2])
mais là ça ne fonctionne pas non plus, ça me modifie la première de mes numpyArray (sans obtenir le résultat souhaité puisque j'obtiens la valeur 128 partout) et ça ne touche pas au reste.

Je suis persuadé que la solution n'est pas loin et assez évidente, mais je manque de pratique en Python et pour le moment elle m'échappe et ça m’énerve XD, c'est pourquoi j'attends avec impatience vos conseils avisés !

Merci d'avance ! En espérant avoir posé mon problème suffisamment clairement.