Seite 1 von 1

PNG-Datei in Python bearbeiten

Verfasst: Montag 19. August 2019, 16:23
von wiqtibel
Hallo,
ich muss euch warnen, denn ich bin ein Anfänger im Thema programmieren in Python.
Für meine W-Seminararbeit muss ich ein neuronales Netz mit meiner eigenen Handschrift trainieren, dass neuronale netz hab ich in Python schon erstellt und ich bin auf eine Website gestoßen https://www.linux-community.de/ausgaben ... -vernetzt/ die zeigt wie man eingescannte Bilder für das Netz zurecht schneidet. Der Code dafür lautet: "$ convert input.png -crop 74x74 -trim -background white -resize 28x28 -gravity center -extent 28x28 +repage -alpha off my%03d.png" und ich habe ein png-Bild auf meinem Desktop mit der entsprechenden Größe. Wenn ich jedoch den Code kopiere und in mein Jupyter Notebook einfüge und das "Input.png" verändere durch "Beispiel.png" (so heißt das png-Bild auf meinem Desktop), kommt immer ein Invalid Syntax Erorr.
Kann mir bitte jemand weiterhelfen wie ich dieses Problem lösen kann, denn im Internet habe ich bisher noch keine Lösung für das Problem gefunden.
Für Tipps für mein Projekt bin ich auch sehr Dankbar.

Re: PNG-Datei in Python bearbeiten

Verfasst: Montag 19. August 2019, 16:50
von __deets__
Das ist ja auch kein Python-Code, sondern ein Shell-Kommando welches das Tool ImageMagick benutzt. Das gibst du nicht in Jupyter ein. Sondern auf der Eingabeaufforderung. Terminal unter *NIXen und macOS, und irgendwie geht das bestimmt auch unter Windows, dazu mal ImageMagick installieren und ausprobieren.

Re: PNG-Datei in Python bearbeiten

Verfasst: Montag 19. August 2019, 17:45
von Sirius3
Wenn Du es mit Python machen willst, kannst Du Dir mal pillow anschauen, da geht das, was Du hier machst, sicher auch.

Re: PNG-Datei in Python bearbeiten

Verfasst: Dienstag 20. August 2019, 14:18
von wiqtibel
Ok vielen Dank für eure Hilfe

Re: PNG-Datei in Python bearbeiten

Verfasst: Dienstag 20. August 2019, 14:39
von wiqtibel
__deets__ hat geschrieben: Montag 19. August 2019, 16:50 Das ist ja auch kein Python-Code, sondern ein Shell-Kommando welches das Tool ImageMagick benutzt. Das gibst du nicht in Jupyter ein. Sondern auf der Eingabeaufforderung. Terminal unter *NIXen und macOS, und irgendwie geht das bestimmt auch unter Windows, dazu mal ImageMagick installieren und ausprobieren.
Ok mit ImageMagick hat jetzt alles geklappt, bin dir mega Dankbar :D

PNG-Datei in Python bearbeiten

Verfasst: Dienstag 20. August 2019, 16:57
von wiqtibel
Leider muss ich mich wieder melden, denn ich komm nicht mehr weiter.
In dem gleichen Artikel auf Seite 2 : https://www.linux-community.de/ausgaben ... ernetzt/2/, gibt es diesmal wirklich ein richtiges Python-Skript zum umwandeln der PNG-Dateien in CSV-Dateien:

Code: Alles auswählen

import matplotlib.image as mpimg
import numpy as np
import os
def writeImagestoCSV(mydir,csvfile,picid):
  '''Write images like picid-nnm.png in
     directory mydir to csvfile in current directory.
     -nnm are three digits, the last one
     identifying the name of the number.
  '''
  with open(csvfile,'wb') as fp:
    for fn in os.listdir(mydir):
      fna = fn.split('.')[0][-1]
      if (fn.split('.')[0][0:2] == picid):
        img = mpimg.imread(mydir+fn)
        pixels = np.asarray(img)
        # print(pixels.shape,fn)
        apixels = np.reshape(pixels,28*28)
        apixels = 255-(apixels*255).astype(int)
        apixels = np.append(int(fna),apixels)
        np.savetxt(fp,[apixels],fmt='%i',delimiter=",")
writeImagestoCSV('meinbildverzeichnis/','test.csv','my')
In der letzten Zeile ist ja die Methode writeImagestoCSV in der man 3 Parameter eingeben muss.
bei dem ersten Parameter muss ich doch das Verzeichnis des Ordners angeben indem die PNG-Bilder sich befinden, bei mir "C:\Benutzer\Desktop\Testbilder2" und die anderen beiden Parameter kann ich ja so lassen.
Jedoch kommt dann immer der Fehler, dass der Pfad nicht gefunden wird.
Wisst ihr woran das liegen kann ?
Danke im Voraus

Re: PNG-Datei in Python bearbeiten

Verfasst: Dienstag 20. August 2019, 17:06
von sparrow
Ich würde sagen, dass liegt daran, dass der Pfad nicht gefunden wird.
Hilfreich wäre dein tatsächlicher Code und die vollständige Fehlermeldung (Stacktrace), sonst ist das Lesen in der Glaskugel.

Re: PNG-Datei in Python bearbeiten

Verfasst: Dienstag 20. August 2019, 19:08
von wiqtibel
Hier seht ihr meinen Vollständigen Code
Der Pfad wird nun gefunden aber der Error ist nun komplizierter :cry:
Langsam verzweifle ich an meiner Arbeit.

Code: Alles auswählen

 import matplotlib.image as mpimg
import numpy as np
import os
def writeImagestoCSV(mydir,csvfile,picid):
  '''Write images like picid-nnm.png in
     directory mydir to csvfile in current directory.
     -nnm are three digits, the last one
     identifying the name of the number.
  '''
  with open(csvfile,'wb') as fp:
    for fn in os.listdir(mydir):
      fna = fn.split('.')[0][-1]
      if (fn.split('.')[0][0:2] == picid):
        img = mpimg.imread(mydir+fn)
        pixels = np.asarray(img)
        # print(pixels.shape,fn)
        apixels = np.reshape(pixels,28*28)
        apixels = 255-(apixels*255).astype(int)
        apixels = np.append(int(fna),apixels)
        np.savetxt(fp,[apixels],fmt='%i',delimiter=",")



writeImagestoCSV('C:\Users\Pfeifer\Desktop','test.csv','my')




File "<ipython-input-13-7a869b1f67ae>", line 1
    writeImagestoCSV('C:\Users\Pfeifer\Desktop','test.csv','my')
                    ^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

Re: PNG-Datei in Python bearbeiten

Verfasst: Dienstag 20. August 2019, 19:35
von sparrow
Du weißt doch gar nicht, ob der Pfad gefunden wiord. So weit kommt der Code doch gar nicht.
Ein Backslash (\) muss in einer Zeichenkette durch einen Backslash (\) escaped werden, wenn du wirklich einen Backslash meinst. "\n" ist z.B. das Zeichen für einen Zeilenwechsel, deshalb ist das Escapen nötig, falls du das nicht meinst.

Korrekt wäre

Code: Alles auswählen

'C:\\Users\\Pfeifer\\Desktop'
#oder
r'C:\Users\Pfeifer\Desktop'
Das "r" vor einer Zeichenkette deklariert diese als "raw string". Da wird dann genau so genommen, wie sie kommt. Dafür kann man keine Newlines, etc. verwenden.

Re: PNG-Datei in Python bearbeiten

Verfasst: Mittwoch 21. August 2019, 13:53
von wiqtibel

Code: Alles auswählen

writeImagestoCSV(r'C:\Users\Pfeifer\Desktop\Testbilder2\','test.csv','my')

 File "<ipython-input-4-01fe34d99a39>", line 1
    writeImagestoCSV(r'C:\Users\Pfeifer\Desktop\Testbilder2\','test.csv','my')
                                                                  ^
SyntaxError: invalid syntax

Jetzt wird doch der Pfad gefunden weil der Fehler danach angezeigt wird oder ?

Re: PNG-Datei in Python bearbeiten

Verfasst: Mittwoch 21. August 2019, 14:26
von __deets__
Noe, du hast das einzelne Anfuehrungszeichen escaped, und dann kommt es eben spaeter zu einem Fehler.

Re: PNG-Datei in Python bearbeiten

Verfasst: Mittwoch 21. August 2019, 14:28
von sparrow
An der Stelle wird noch gar nichts mit dem Pfad gemacht, das ist nur eine Zeichenkette.

Der Fehler ist ein anderer. Auch bei raw Strings kann man Anführungszeichen escapen. Deshalb denkt der Interpreter, dass die Zeichenkette nicht aufhört.

Ich habe noch eine dritte Variante vergessen, und die sollest du benutzen: Verwende / statt \ bei der Pfadangabe. Python kann damit auch unter Windows arbeiten:

Code: Alles auswählen

writeImagestoCSV('C:/Users/Pfeifer/Desktop/Testbilder2/','test.csv','my')

Re: PNG-Datei in Python bearbeiten

Verfasst: Mittwoch 21. August 2019, 15:08
von wiqtibel

Code: Alles auswählen

import matplotlib.image as mpimg
import numpy as np
import os
def writeImagestoCSV(mydir,csvfile,picid):
  '''Write images like picid-nnm.png in
     directory mydir to csvfile in current directory.
     -nnm are three digits, the last one
     identifying the name of the number.
  '''
  with open(csvfile,'wb') as fp:
    for fn in os.listdir(mydir):
      fna = fn.split('.')[0][-1]
      if (fn.split('.')[0][0:2] == picid):
        img = mpimg.imread(mydir+fn)
        pixels = np.asarray(img)
        # print(pixels.shape,fn)
        apixels = np.reshape(pixels,28*28)
        apixels = 255-(apixels*255).astype(int)
        apixels = np.append(int(fna),apixels)
        np.savetxt(fp,[apixels],fmt='%i',delimiter=",")
das ist ja der Code kopiert von der Website https://www.linux-community.de/ausgaben ... ernetzt/2/

Und dank deinem Tipp sparrow wird das Verzeichnis gefunden

jedoch kommt jetzt garkeine Fehlermeldung und das Programm macht Garnichts
ich denke es liegt daran, dass die anderen beiden Parameter irgendwie "ausgeblendet" werden weil die "rot" sind

Code: Alles auswählen

writeImagestoCSV('C:/Users/Pfeifer/Desktop/Testbilder2/','test.csv','my')

Re: PNG-Datei in Python bearbeiten

Verfasst: Mittwoch 21. August 2019, 15:24
von Sirius3
Zumindest eine leere Datei in irgendeinem Verzeichnis (Dein Arbeitsverzeichnis) sollte erzeugt werden.
Zum Code: eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 2. Variablennamen sollten aussagekräftig sein und keine Abkürzungen, also fn -> filename, mydir -> image_directory, fna -> ?????? etc.
Für Dateinamen-Operationen kennt Python im Modul os.path einige Funktionen. Die sollte man statt des String-Gewurschtels nehmen. os.path.splitext statt str.split. Und diese Operation sollte man auch nicht unnötigerweise gleich zweimal machen, sondern das Ergebnis in einer Variable speichern
Um if-Bedingungen gehören keine Klammern.
Pfade werden mit os.path.join zusammengesetzt, sonst hast Du das Problem, dass es nicht funktioniert, falls Du den / am Ende der Vezeichnisangabe vergißt, oder absichtlich wegläßt, weil der da eigentlich nicht hingehört und bei Deinem letzten Problem ja auch tatsächlich Probleme gemacht hat.
`imread` liefert schon ein Numpy-Array, weshalb das asarray überflüssig ist.

Re: PNG-Datei in Python bearbeiten

Verfasst: Mittwoch 21. August 2019, 15:43
von wiqtibel
Ich möchte mich mal bei allen hier bedanken für eure Hilfe und schnellen Antworten. Ich Hab jetzt endlich die CSV-Dateien auf meinem Computer und kann endlich meine Ferien genießen. Vielleicht melde ich mich im späteren Verlauf meiner Arbeit nochmal wenn ich nicht mehr weiterkomme, weil ihr seid hilfreicher als mein Informatiklehrer :lol:

Servus