numpyArray trouver certaines valeurs et les modifier
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:
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:
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:
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.