Forum: Digitale Signalverarbeitung / DSP / Machine Learning Python (numpy und) list comprehension


von Konstantin F. (Firma: "Konniemara") (konstantin-2)


Lesenswert?

Hi!

Ich bin ziemlich neu in Python (3). Möchte gerne in Zukunft damit besser 
zurecht kommen und Sachen die ich früher mit Matlab gemacht habe mit 
Python erschlagen.

Ist aber ein ziemlicher Brocken. Die Matlab-Phse an sich ist schon etwas 
her und ich tue mich traditionell etwas schwer mit Skript-Sprachen. 
Speziell die Art wie in Python Arrays verarbeitet werden gewinnt derzeit 
noch gegen mein Hirn. Anscheinend.

Also das paket numpy habe ich als sinnvolle Matlab alternative gefunden 
und probiere rum. Aber wie gesagt durch meinen Lernstatus kommt da 
anscheinend einiges durcheinander. Wäre froh um Erhellung!

Im Beispiel wollte ich ursprünglich bei einem Bild den Rot-Kanal vom 
Grün-Kanal abziehen. Ohne Sinn - nur um besser rein zu kommen. Ist aber 
grandios gescheitert ich schaffe es nicht mal über das geladene Bild 
Pixelweise zu iterieren. Folgender Code wird ausgeführt (immerhin) aber 
das Bild stimmt nicht mit original überein. Jeweils Pixel subtrahieren 
schaffe ich gar nicht:
1
import matplotlib.pyplot as plt
2
import matplotlib.image as mpimg
3
import numpy as np
4
5
image_path = "tst.bmp"
6
7
im = mpimg.imread(image_path)
8
9
im_neu = np.array([im[x,y,:] for y in range(im.shape[1]) for x in range(im.shape[0])])
10
#mentale Zerrung-wie gehts? MUSS ich zwingend noch mal in np.array zurück wandeln? #Kann ich nicht auf Array-Ebene bleiben und wie 'ginge' das mit einer #liste richtig?
11
12
im_neu = np.reshape( im_neu, (im.shape[0],im.shape[1],3) )
13
#Leider Dimension verloren
14
15
plt.imshow(im_neu)

Wie geht das und wo ist mein Verständnisfehler?

: Verschoben durch Admin
von Konstantin F. (Firma: "Konniemara") (konstantin-2)


Lesenswert?

1
import matplotlib.pyplot as plt
2
import matplotlib.image as mpimg
3
import numpy as np
4
from copy import deepcopy
5
#from PIL import Image
6
7
image_path = "tst.bmp"
8
9
im = mpimg.imread(image_path)
10
im_neu = np.zeros((im.shape[0],im.shape[1],3)).astype(np.uint8)
11
12
13
for r in range(im.shape[0]):
14
     for c in range(im.shape[1]):
15
        im_neu[r,c]=im[r,c,0]-im[r,c,1]
16
17
plt.imshow(im_neu)


Rumprobieren hat mich hier hin gebracht. Aber damit geht jetzt das 
Schöne an Python Code flöten.
Also - wie würde ich das sinnvoller machen?

von Lukas K. (carrotindustries)


Lesenswert?

Ist mit der numpy-Denke ganz easy:
1
img_neu = np.transpose([img[...,:,0]-img[...,:,1], img[...,:,1], img[...,:,1]], axes=(1,2,0))
img_neu ist dann ein Farbbild mit rot = rot-grün.

Wem das mit den slices zu komisch ist:
1
r,g,b= np.transpose(img, (2,0,1))
2
img_neu = np.transpose([r-g,g,b], axes=(1,2,0))

Python und numpy haben hier recht verschiedene Ansätze davon, wie sowas 
funktioniert. Wenn man bei numpy list comprehensions braucht, macht man 
i.d.R. was falsch.

von Konstantin F. (Firma: "Konniemara") (konstantin-2)


Lesenswert?

cool,
ich habe aber jetzt das Gefühl ich sollte unbedingt versuchen nicht zu 
schnell zu viel anzugehen und eins nach dem anderen zu begreifen.
Nachher ist alles ein kunterbunter Mix als halbgarem Zeug was dann noch 
schwieriger ist zu ordnen.

Jeder weiß ja dass lesen und nachvollziehen was anderes ist als aktiv 
tun. Aber bis jetzt mag ich trotz eine gewissen Ähnlichkeit die matlab 
Notation mehr. Mag Gewohnheit sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.