Mort626
Lieutenant
- Registriert
- Feb. 2013
- Beiträge
- 715
Hallo,
ich arbeite für ein Uniprojekt gerade an einem Analysetool für JPEG-Bilder. Dafür müssen der Encoder und Decoder manuell implementiert werden. Die Funktion steht erstmal, aber mit Performance aus der Hölle.
Beispiel: Für die Farbraumtransformation von RGB nach YCbCr soll diese Formel genutzt werden (siehe Code):
Nun war die Idee, mathematische Operationen müssten mit Numpy schneller gehen als mit den Standard-Listen von Python. Die Matrixmultiplikation (in version 2) läuft an sich auch 10x schneller, allerdings ist die gesamtfunktion umgekehrt 10x langsamer als version 1. Also vermtlich irgendwo im Zugriff auf die Daten ist etwas faul, was lange dauert.
Kann mir jemand sagen woran das liegen könne?
ich arbeite für ein Uniprojekt gerade an einem Analysetool für JPEG-Bilder. Dafür müssen der Encoder und Decoder manuell implementiert werden. Die Funktion steht erstmal, aber mit Performance aus der Hölle.
Beispiel: Für die Farbraumtransformation von RGB nach YCbCr soll diese Formel genutzt werden (siehe Code):
Nun war die Idee, mathematische Operationen müssten mit Numpy schneller gehen als mit den Standard-Listen von Python. Die Matrixmultiplikation (in version 2) läuft an sich auch 10x schneller, allerdings ist die gesamtfunktion umgekehrt 10x langsamer als version 1. Also vermtlich irgendwo im Zugriff auf die Daten ist etwas faul, was lange dauert.
Kann mir jemand sagen woran das liegen könne?
Python:
# Version 1
#"for d in img_e_data" returns a tupel [r,g,b] for each pixel
y_img = [round(0.299*d[0] + 0.587*d[1] + 0.114*d[2])"]
cb_img = [round(-0.169*d[0] - 0.331*d[1] + 0.5*d[2] +128) for d in img_e_data]
cr_img = [round(0.5*d[0] - 0.419*d[1] - 0.081*d[2] +128) for d in img_e_data]
#version 2
#Transformation matrix for rgb -> ycbcr
trafo_table = np.array([
[0.299,0.587,0.114],
[-0.169,-0.331,0.5],
[0.5,-0.419,-0.081]])
y_arr = np.zeros((self.height_e, self.width_e), dtype=np.uint8)
cb_arr = np.zeros((self.height_e, self.width_e), dtype=np.uint8)
cr_arr = np.zeros((self.height_e, self.width_e), dtype=np.uint8)
for i in range(self.height_e):
for j in range(self.width_e):
#extract rgb values from each pixel
pxl = img_e_data[i,j]
rgb = np.array([pxl[0],pxl[1],pxl[2]])
#matrix multiplikation with transformation matrix
ycbcr = np.dot(trafo_table, rgb)
#normalize color channels
y_arr[i,j]=round(ycbcr[0])
cb_arr[i,j]=round(ycbcr[1])+128
cr_arr[i,j]=round(ycbcr[2])+128
return y_arr, cb_arr, cr_arr