PNG-Datei in Python bearbeiten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
wiqtibel
User
Beiträge: 8
Registriert: Montag 19. August 2019, 16:04

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du es mit Python machen willst, kannst Du Dir mal pillow anschauen, da geht das, was Du hier machst, sicher auch.
wiqtibel
User
Beiträge: 8
Registriert: Montag 19. August 2019, 16:04

Ok vielen Dank für eure Hilfe
wiqtibel
User
Beiträge: 8
Registriert: Montag 19. August 2019, 16:04

__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
wiqtibel
User
Beiträge: 8
Registriert: Montag 19. August 2019, 16:04

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
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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.
wiqtibel
User
Beiträge: 8
Registriert: Montag 19. August 2019, 16:04

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
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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.
wiqtibel
User
Beiträge: 8
Registriert: Montag 19. August 2019, 16:04

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 ?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Noe, du hast das einzelne Anfuehrungszeichen escaped, und dann kommt es eben spaeter zu einem Fehler.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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')
wiqtibel
User
Beiträge: 8
Registriert: Montag 19. August 2019, 16:04

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')
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
wiqtibel
User
Beiträge: 8
Registriert: Montag 19. August 2019, 16:04

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
Antworten