![]() |
Re: Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitspr
okay jetzt gibts schon wieder ein neues Problem.
Meine Idee ist es, jeder Ziffer eine Art Code zu geben durch die sie identifizierbar ist. Der Code einer Ziffer wird generiert durch deren Schwarz-Weiß Bild. In diese werden dann die Wechsel zwischen schwarzen und weißen Pixeln verarbeitet. Der Code für die Ziffer 1 sieht dann so aus:
Delphi-Quellcode:
Auf menschlich: 251 weiße Pixel, auf diese folgt 1 schwarzes Pixel, dann kommen 26 weiße Pixel, dann 1 schwarzes usw.
Ziffer_1 : array[0..9] of integer = (251, 1, 26, 1, 26, 1, 24, 13, 14, 13);
Alle Zifferncodes:
Delphi-Quellcode:
Meine Idee ist es jetzt, dass wenn eins der Bilder mit einer Ziffer eingelesen wird, für dieses Bild solch ein Code erstellt wird. Dann wird der Code auf die größtmögliche Gemeinsamkeit mit den 9 definierten Codes überprüft. Die größte Gemeinsamkeit soll dann als Treffer angenommen werden.
Ziffer_1 : array[0..9] of integer = (251, 1, 26, 1, 26, 1, 24, 13, 14, 13);
Ziffer_2 : array[0..37] of integer = (250, 3, 6, 3, 14, 4, 5, 4, 14, 2, 6, 5, 14, 2, 6, 2, 1, 2, 14, 1, 6, 2, 2, 2, 14, 2, 4, 2, 3, 2, 14, 7, 4, 2, 15, 6, 4, 2); Ziffer_3 : array[0..35] of integer = (250, 2, 7, 2, 15, 3, 7, 3, 14, 2, 10, 1, 14, 1, 5, 1, 5, 2, 13, 1, 5, 1, 5, 2, 13, 2, 3, 3, 3, 2, 14, 13, 16, 3, 2, 5); Ziffer_4 : array[0..27] of integer = (230, 2, 23, 4, 22, 2, 2, 1, 20, 2, 4, 1, 18, 3, 5, 1, 17, 2, 7, 1, 17, 13, 14, 13, 22, 2, 26, 1); Ziffer_5 : array[0..41] of integer = (232, 1, 16, 7, 3, 3, 14, 7, 3, 3, 14, 2, 3, 1, 6, 2, 13, 2, 3, 1, 6, 2, 13, 2, 3, 2, 5, 2, 13, 2, 3, 2, 4, 2, 14, 2, 3, 8, 14, 2, 4, 6); Ziffer_6 : array[0..41] of integer = (226, 6, 18, 11, 16, 3, 2, 2, 2, 3, 14, 2, 3, 2, 5, 1, 14, 2, 3, 1, 6, 2, 13, 1, 4, 2, 5, 2, 13, 2, 3, 2, 4, 2, 14, 3, 2, 8, 15, 2, 3, 6); Ziffer_7 : array[0..27] of integer = (222, 2, 25, 2, 25, 2, 9, 2, 14, 2, 6, 5, 14, 2, 4, 7, 14, 2, 2, 4, 19, 2, 1, 3, 21, 4, 23, 3); Ziffer_8 : array[0..37] of integer = (250, 4, 2, 5, 15, 13, 14, 2, 3, 3, 4, 1, 14, 1, 4, 2, 5, 2, 13, 1, 4, 2, 5, 2, 13, 2, 3, 2, 5, 2, 13, 13, 15, 4, 2, 5, 24, 1); Ziffer_9 : array[0..39] of integer = (225, 3, 22, 7, 3, 2, 14, 3, 2, 3, 3, 2, 14, 2, 5, 1, 4, 2, 13, 1, 6, 1, 4, 2, 13, 1, 6, 1, 4, 2, 13, 2, 4, 2, 3, 2, 15, 11, 17, 9); Und hier ist jetzt mein Problem. Wie vergleiche ich den neu generierten Code mit den 9 vodefinierten auf die größte Ähnlichkeit? Meine Folgende Lösung war leider von der Idee her gut, aber viel zu ungenau:
Delphi-Quellcode:
€: Ich suche diesmal keine Hilfe für das eigentliche Programmieren, sonder vielmehr logische, mathematische Ideen wie man die Codes am besten vergleicht!
.....
for i := 0 to 34 do begin aktErgebnis := aktErgebnis + (strtoint(aktZiffer[i]) - Ziffer_3[i]); //Die Differenz jeder Stelle des Codes aufaddieren end; if abs(aktErgebnis) < abs(bestErgebnis) then //Die kleinste Differenz ist die gesuchte Zahl begin bestErgebnis := abs(aktErgebnis); totalErgebnis := 3; end .... |
Re: Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitspr
Zunächst mal die Frage nach einer Info, die ganz von Anfang an schon sehr wichtig gewesen wäre eigentlich: Woher stammen die Buchstaben? Screenshots? Scans? Von gedrucktem oder Handschrift? Fotos? Mikrofilm? Danach richtet sich ganz stark wie tolerant das Verfahren sein darf/muss, und auch wie komplex.
Eine grundsätzlich ähnliche, aber andere Idee: Lege für jedes Zeichen ein Musterbild an (wie jetzt deine Mustercodes quasi), und bilde die Differenz des aktuellen Kandidaten und aller Muster (ggf. durch Größen schon eingrenzbar). Dort wo nachher am meisten schwarze Pixel im Differenzbild sind, hast du eine ganz gute potentielle Übereinstimmung. Das kann man aber eben auch nur tun, wenn man sicher ist, alle Zeichen immer gleich eingrenzen zu können, und dass alle gleichen Zeichen im zu erkennenden Text sehr ähnlich sind. Aber das musst du bei deinem Verfahren oben ja genau so - daher nehme ich das mal als gegeben an. Das wäre mit der simpelste Ansatz, der bei Screenshots immerhin perfekt arbeitet, und bei gescannten Drucksachen meist auch noch recht zuverlässig ist. Bei Handschrift wird man um ein NN nicht mehr herum kommen, und Fotos haben fast immer zu viele perspektivische Verzerrungen um sie unkorrigiert so nutzen zu können. |
Re: Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitspr
ich erstelle einen Screenshot auf dem gleichgroße gelbe Quadrate zu sehen sind, in die eine schwarze Ziffer geschrieben ist. Dies kann man auhc in meinem Anhang sehn, wie diese einzelnen Quadrate aussehn.
Da jedes Quadrat gleich groß ist, habe ich also die gleichen Ausgangsbedingugnen. Allerdings funktioniert mein Ansatz trotzdem leider nicht. Zitat:
|
Re: Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitspr
Ich denke, dass man es nicht all zu sehr von den Pixeln etc. abhängig machen sollte. Die Idee mit der Kohonen-Map erschien mir sehr plausibel.
Tools wie JDownloader erkennen Captchas, weiß zwar nicht, ob es dazu irgendwo eine Doku gibt, aber das wäre sicherlich mal, falls man dazu was im Internet findet, einen Schnupper wert. |
Re: Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitspr
Wenn es Screenshots klar lesbarer und nicht absichtlich unkenntlich gemachter Zeichen sind, ist ein NN oder Kohonen-Map völlig überdimensioniert.
Zitat:
Evtl. so: Ein einzelner isolierter Pixel Unterschied allein kann schon bedeuten, dass ein Fingerprint 2 Einträge mehr erhält, und somit fast nicht mehr mit dem eigentlich passenden zu identifizieren ist. Das wäre eine Schwachstelle. So am Rande: Wenn die Screenshots zwischendurch nicht verlustbehaftet komprimiert wurden, sollten gleiche Zeichen doch spätestens nach Umwandlung in s/w wirklich 100%ig identisch sein. Brauchst du überhaupt ein intelligentes/tolerantes Verfahren!? |
Re: Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitspr
Zitat:
Zitat:
Zitat:
Zitat:
MFG und danke für euer Engagement |
Re: Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitspr
Zitat:
Zitat:
|
Re: Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitspr
Zitat:
Falls ja würde ich das so umsetzten:
Delphi-Quellcode:
Ist das deine grob deine Idee?
// ~Pseudocode~
for x := 0 to Image.Width -1 do begin for y := 0 to Image.Heiht -1 do begin if aktImage.Canvas.Pixel[x,y] = Image_8.Canvas.Pixel[x,y] then //Wenn im aktuellen Bild und im Differenzbild ein Pixel die gleiche Farbe hat inc(Anzahl_8); //wird der Zähler für Ziffer 8 erhöht. end; end; //Die Zahl die den höchste Zähler hat ist die gesuchte Zahl. |
Re: Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitspr
Das wäre eine Variante, jup. Mir fiel gerade noch ein, dass man das evtl. noch toleranter gegenüber des Antialiasings von ClearType gestalten könnte:
Die Bilder nicht in s/w, sondern Graustufen umwandeln. Dann
Delphi-Quellcode:
Dadurch haut man sich evtl. weniger Fehler durch knappe Grenzwertentscheidungen beim s/w Konvertieren rein.
// ~Pseudocode~
Abweichung_8 := 0; // ist ein float for x := 0 to Image.Width -1 do begin for y := 0 to Image.Heiht -1 do begin Abweichung_8 := Abweichung_8 + Abs(GetRValue(aktImage.Canvas.Pixel[x,y]) - GetRValue(Image_8.Canvas.Pixel[x,y])); end; end; Abweichung_8 := Abweichung_8 / (255*Image.Width*Image.Height); // Abweichung_* = 0 -> identisches Bild // Abweichung_* = 1 -> maximaler Unterschied |
Re: Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitspr
Ich hab es jetzt vollständig hinbekommen, bisher bei über 200 Zahlen kein Fehler.
Bei der Umwandlung in Graustufen traten wieder leichte Ungenauigkeiten auf, da manche Zahlen so eine Art "Glanzeffekt" haben. Deshalb habe ich dann doch wieder den Schwarz-Weiß Filter genommen (10% Toleranz), wodurch dieser Effekt ausgeklammert werden konnte. Mit Hilfe von Mediums Ansatz des Abweichungsvergleichs läuft nun alles perfekt, weshalb ich mich mal wieder bei der DP aber besonders auch bei Medium bedanken möchte. Danke! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz