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 :
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
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)
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.
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)
j'ai alors essayé une autre variante que voici:
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.
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])
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.
Partager