Bild intelligent und automatisch zuschneiden

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Hi,

Input:
Bild von einer Zahl auf einem Blatt Papier. Blatt Papier kann auch kariert sein oder so. Das Bild kann auch das ganze Blatt zeigen, sodass der Tisch, auf dem es liegt, anzeigt wird.


Was möchte ich haben?
Ich möchte das große Bild derart zuschneiden, sodass nur noch Zahl und eventuell paar Pixel um die Zahl in quadratischer Form angezeigt wird.


Was habe ich bereits gemacht?

Code: Alles auswählen

new_img = cv2.imread(path, flags=0) #flags=0 heißt, dass es in grau eingelesen wird

#find the edges
new_img_edges = cv2.Canny(new_img,350,350)
    
#find contours
ctrs, hier = cv2.findContours(new_img_edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
Frage:
Es werden mir jetzt mehrere Konturen ausgegeben, natürlich auch die, welche das Blatt von dem Tisch abgrenzt. Wie finde ich nun die richtige Kontur, welche die Zahl darstellt automatisch?
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Indem du direkt nach der Zahl suchst. Es gibt bestimmt neuronale Netze da draussen, die dir Vorkommen von Zahlen in deinem Bild zeigen. Und wenn du einen Kandidaten hast fuer eine Zahl, dann kannst du in einem Ausschnitt um diesen Kandidaten weiter suchen. Falls das ueberhaupt noch relevant sein sollte.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@naheliegend: Kurze Anmerkung zum Kommentar beim lesen der Datei: Genau darum schreibt man keine ”magischen” Zahlen in den Quelltext. Statt der 0 sollte da `cv2.IMREAD_GRAYSCALE` stehen. Und schon muss man nicht mehr erklären was die 0 bedeutet.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

__deets__ hat geschrieben: Mittwoch 29. April 2020, 14:23 Indem du direkt nach der Zahl suchst. Es gibt bestimmt neuronale Netze da draussen, die dir Vorkommen von Zahlen in deinem Bild zeigen. Und wenn du einen Kandidaten hast fuer eine Zahl, dann kannst du in einem Ausschnitt um diesen Kandidaten weiter suchen. Falls das ueberhaupt noch relevant sein sollte.
Genau das möchte ich ja selbst bauen :-)
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann benutz dein NN, um das Gesamtproblem zu loesen. Wenn man das Blatt Papier so einfach isolieren koennte, braeuchte man auch kein zusaetzliches NN fuer die Zahl. Die ist dann trivial mit zB einer SVM zu erkennen, wie man das schon lange bei Handschriften oder Nummernschildern macht.
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

Das Problem ist nicht ganz einfach. Je nach dem wie unterschiedlich die Bilder sind, die du verarbeiten möchtest. Wenn sie sehr unterschiedlich sind (Variation von: Zettelfarbe, Tischfarbe, Größe Zettel, Größe Tisch, Winkel der Aufnahme, Umgebungsbedingungen usw.), dann besteht fast keine Möglichkeit das gut zu erkennen, außer man kann ein bereits fertiges Netz nutzen. Im Allgemeinen ist das Vorgehen so, dass man gemeinsame, konstante Merkmale sucht. Beispielsweise kann der Tisch immer grün sein und das Blatt immer weiß. Oder das Blatt ist in der Aufnahme immer gleich groß, oder oder oder. Dann kannst du nämlich genau danach deine Konturen filtern (z. B. mit dem Check, ob die Fläche "Bounding Rectangles" größer oder kleiner als ein bestimmter Wert ist) bzw. im Preprocessing Bereiche mit bestimmten Farben auswählen. Versuche also Konstanten zu finden und diese als Kriterien zu nutzen.
Antworten