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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Konstantin F. (Firma: "Konniemara") (konstantin-2)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.