Ich möchte die Differenzzahl aus dem Diagramm der Pachislot-Datenseite berechnen.
Zu diesem Zeitpunkt wird die Anzahl der auf der OCR angezeigten Blätter erfasst, da die Anzahl der im Diagramm angezeigten Blätter erforderlich war.
Ein solches Diagrammbild.
Was Sie erhalten möchten, ist die oben links angezeigte Nummer (2410 im Fall dieses Bildes)
・ Tesseract (4.0 oder höher) ・ PyOCR
Die Installationsmethode usw. entfällt. Ein Referenzlink befindet sich am Ende der Seite. Bitte verwenden Sie diesen.
Lesen Sie dieses Diagramm vorerst so, wie es ist.
from PIL import Image
import pyocr
import pyocr.builders
import sys
file_path = 'Dateipfad'
#Laden von Werkzeugen
tools = pyocr.get_available_tools()
#Wenn Sie das Werkzeug nicht finden können
if len(tools) == 0:
print('Ich kann Pyocr nicht finden. Bitte installieren Sie pyocr.')
sys.exit(1)
tool = tools[0]
#Bild wird geladen
img_org = Image.open(file_path)
# OCR
max_medals = tool.image_to_string(img_org, lang='jpn', builder=pyocr.builders.DigitBuilder(tesseract_layout=6))
print(f'max_medals:{max_medals}')
Ausführungsergebnis
-
Ich konnte keine Zahlen bekommen.
Nachdem ich verschiedene Dinge untersucht habe, scheint es genauer zu sein, numerische OCR mit einem englischen Datensatz durchzuführen, daher habe ich die Spracheinstellung auf Englisch geändert.
from PIL import Image
import pyocr
import pyocr.builders
import sys
file_path = 'Dateipfad'
#Laden von Werkzeugen
tools = pyocr.get_available_tools()
#Wenn Sie das Werkzeug nicht finden können
if len(tools) == 0:
print('Ich kann Pyocr nicht finden. Bitte installieren Sie pyocr.')
sys.exit(1)
tool = tools[0]
#Bild wird geladen
img_org = Image.open(file_path)
# OCR
max_medals = tool.image_to_string(img_org, lang='eng', builder=pyocr.builders.DigitBuilder(tesseract_layout=6))
print(f'max_medals:{max_medals}')
Ausführungsergebnis
2410 1300160019.00
Diesmal konnte ich einige der angezeigten Zahlen erhalten.
Da ich jedoch die unnötigen Teile gelesen habe, schreibe ich sie neu, sodass nur der Teil, den ich lesen möchte, ausgeschnitten und dann verarbeitet wird.
from PIL import Image
import pyocr
import pyocr.builders
import sys
file_path = 'Dateipfad'
#Laden von Werkzeugen
tools = pyocr.get_available_tools()
#Wenn Sie das Werkzeug nicht finden können
if len(tools) == 0:
print('Ich kann Pyocr nicht finden. Bitte installieren Sie pyocr.')
sys.exit(1)
tool = tools[0]
#Bild wird geladen
img_org = Image.open(file_path)
#Schneiden Sie den Teil mit der Notation aus
max_medals_img = img_org.crop((0, 0, 45, 15))
# OCR
max_medals = tool.image_to_string(max_medals_img , lang='eng', builder=pyocr.builders.DigitBuilder(tesseract_layout=6))
print(f'max_medals:{max_medals}')
Ausführungsergebnis
max_medals:2410
Es ging gut!
Da es mit dem vorherigen Code gut funktioniert hat, habe ich die Anzahl der zu lesenden und erneut versuchten Grafikbilder erhöht.
from PIL import Image
import pyocr
import pyocr.builders
import sys
from glob import glob
file_path = 'Dateispeicherverzeichnis'
#Erstellen Sie eine Dateiliste zum Lesen
file_list = [file for file in glob(f'{file_path}*.png')]
for file_path in file_list:
#Laden von Werkzeugen
tools = pyocr.get_available_tools()
#Wenn Sie das Werkzeug nicht finden können
if len(tools) == 0:
print('Ich kann Pyocr nicht finden. Bitte installieren Sie pyocr.')
sys.exit(1)
tool = tools[0]
#Bild wird geladen
img_org = Image.open(file_path)
#Schneiden Sie den Teil mit der Notation aus
max_medals_img = img_org.crop((0, 0, 45, 15))
# OCR
max_medals = tool.image_to_string(max_medals_img, lang='eng', builder=pyocr.builders.DigitBuilder(tesseract_layout=6))
print(f'max_medals:{max_medals}')
Ausführungsergebnis
max_medals:2410
max_medals:
max_medals:490
max_medals:2717
max_medals:689
max_medals:504
max_medals:1013
max_medals:
max_medals:862
max_medals:979
max_medals:835
max_medals:1683
max_medals:1587
max_medals:1010
max_medals:7
max_medals:1586
max_medals:1653
max_medals:413
max_medals:1167
max_medals:527
Einige Bilder wurden nicht richtig gelesen.
Ich habe OCR bereits mit einem anderen Formatbild versucht und zu diesem Zeitpunkt habe ich keinen Fehler erhalten, aber das Format zu diesem Zeitpunkt ist
"Hintergrundfarbe: weiß, Textfarbe: schwarz"
Da es sich um ein Bild des Formats handelte, habe ich versucht, die Hintergrundfarbe und die Textfarbe umzukehren.
from PIL import Image, ImageOps
import pyocr
import pyocr.builders
import sys
from glob import glob
file_path = 'Dateispeicherverzeichnis'
#Erstellen Sie eine Dateiliste zum Lesen
file_list = [file for file in glob(f'{file_path}*.png')]
for file_path in file_list:
#Laden von Werkzeugen
tools = pyocr.get_available_tools()
#Wenn Sie das Werkzeug nicht finden können
if len(tools) == 0:
print('Ich kann Pyocr nicht finden. Bitte installieren Sie pyocr.')
sys.exit(1)
tool = tools[0]
#Bild wird geladen
img_org = Image.open(file_path)
#Schneiden Sie den Teil mit der Notation aus
max_medals_img = img_org.crop((0, 0, 45, 15))
#Hintergrundfarbe und Textfarbe umkehren (von weißem Text in schwarzen Text konvertieren)
max_medals_img = ImageOps.invert(max_medals_img.convert('RGB'))
# OCR
max_medals = tool.image_to_string(max_medals_img, lang='eng', builder=pyocr.builders.DigitBuilder(tesseract_layout=6))
print(f'max_medals:{max_medals}')
Ausführungsergebnis
max_medals:2410
max_medals:440
max_medals:490
max_medals:2717
max_medals:689
max_medals:504
max_medals:1013
max_medals:791
max_medals:862
max_medals:979
max_medals:835
max_medals:1683
max_medals:1587
max_medals:1010
max_medals:1132
max_medals:1586
max_medals:1653
max_medals:413
max_medals:1167
max_medals:527
Bilder, die nicht normal erkannt werden konnten, wurden ebenfalls normal erkannt.
Ich habe versucht, die Anzahl der Bildlesebeispiele mit diesem Code zu erhöhen ...
Ausführungsergebnis
max_medals:1908.
max_medals:
max_medals:1000-
max_medals:10
Es gibt immer noch seltene Fälle, in denen Zeichen, die nicht auf diese Weise geschrieben wurden, eingemischt werden, die Anzahl der Ziffern falsch ist oder die Zahlen überhaupt nicht erkannt werden können.
(7 von 10.000)
Der OCR-Modus wurde geändert, um die Genauigkeit weiter zu verbessern.
from PIL import Image, ImageOps
import pyocr
import pyocr.builders
import sys
from glob import glob
file_path = 'Dateispeicherverzeichnis'
#Erstellen Sie eine Dateiliste zum Lesen
file_list = [file for file in glob(f'{file_path}*.png')]
for file_path in file_list:
#Laden von Werkzeugen
tools = pyocr.get_available_tools()
#Wenn Sie das Werkzeug nicht finden können
if len(tools) == 0:
print('Ich kann Pyocr nicht finden. Bitte installieren Sie pyocr.')
sys.exit(1)
tool = tools[0]
#Bild wird geladen
img_org = Image.open(file_path)
#Schneiden Sie den Teil mit der Notation aus
max_medals_img = img_org.crop((0, 0, 45, 15))
#Hintergrundfarbe und Textfarbe umkehren (von weißem Text in schwarzen Text konvertieren)
max_medals_img = ImageOps.invert(max_medals_img.convert('RGB'))
# OCR
max_medals = tool.image_to_string(max_medals_img, lang='eng', builder=pyocr.builders.DigitBuilder(tesseract_layout=8))
print(f'max_medals:{max_medals}')
In einen Modus geändert, in dem ein Bild selbst als Wort betrachtet wird. (Dieser Modus sollte optimal sein, da die OCR ausgeführt wird, nachdem nur der Teil mit der Nummernnotation geschnitten wurde.) Dieser Modus ist genauer.
(Reduziert auf ungefähr 4 von 10.000)
Da es jedoch Fälle gab, in denen es nicht normal erkannt wurde, habe ich einen Code hinzugefügt, um vorerst andere Zeichen als numerische Werte auszuschließen.
import re
from PIL import Image, ImageOps
import pyocr
import pyocr.builders
import sys
from glob import glob
file_path = 'Dateispeicherverzeichnis'
#Erstellen Sie eine Dateiliste zum Lesen
file_list = [file for file in glob(f'{file_path}*.png')]
for file_path in file_list:
#Laden von Werkzeugen
tools = pyocr.get_available_tools()
#Wenn Sie das Werkzeug nicht finden können
if len(tools) == 0:
print('Ich kann Pyocr nicht finden. Bitte installieren Sie pyocr.')
sys.exit(1)
tool = tools[0]
#Bild wird geladen
img_org = Image.open(file_path)
#Schneiden Sie den Teil mit der Notation aus
max_medals_img = img_org.crop((0, 0, 45, 15))
#Hintergrundfarbe und Textfarbe umkehren (von weißem Text in schwarzen Text konvertieren)
max_medals_img = ImageOps.invert(max_medals_img.convert('RGB'))
# OCR
max_medals = tool.image_to_string(max_medals_img, lang='eng', builder=pyocr.builders.DigitBuilder(tesseract_layout=8))
#Entfernen Sie nicht numerische Zeichen
max_medals = re.sub(r'\D', '', max_medals)
print(f'max_medals:{max_medals}')
Dies vermeidet den Fall, dass andere Zeichen als nicht markierte Zahlen wie "-" und "." Eingemischt werden.
In seltenen Fällen konnte der numerische Wert selbst jedoch nicht erkannt werden oder die Anzahl der Ziffern war falsch.
Ich frage mich, was ich tun und verschiedene Verbesserungsmaßnahmen entwickeln soll
Holen Sie sich die Nummernnotation sowohl oben links als auch unten links im Bild ↓ Vergleichen Sie beide ↓ Adoptiere eine Person, die normal zu sein scheint
Ich habe über einige logische Muster nachgedacht, aber der Code war lang und kompliziert, deshalb werde ich hier ein wenig darüber nachdenken.
** "Erstens müssen Sie keinen störenden Code schreiben, wenn Sie die Erkennungsgenauigkeit in OCR verbessern können." **
Ich kam auf die Idee, dass es ganz natürlich ist, und versuchte, die Ausschnittgröße der OCR-Vorverarbeitung auf verschiedene Arten zu ändern.
import re
from PIL import Image, ImageOps
import pyocr
import pyocr.builders
import sys
from glob import glob
file_path = 'Dateispeicherverzeichnis'
#Erstellen Sie eine Dateiliste zum Lesen
file_list = [file for file in glob(f'{file_path}*.png')]
for file_path in file_list:
#Laden von Werkzeugen
tools = pyocr.get_available_tools()
#Wenn Sie das Werkzeug nicht finden können
if len(tools) == 0:
print('Ich kann Pyocr nicht finden. Bitte installieren Sie pyocr.')
sys.exit(1)
tool = tools[0]
#Bild wird geladen
img_org = Image.open(file_path)
#Schneiden Sie den Teil mit der Notation aus
max_medals_img = img_org.crop((0, 0, 44, 14))
#Hintergrundfarbe und Textfarbe umkehren (von weißem Text in schwarzen Text konvertieren)
max_medals_img = ImageOps.invert(max_medals_img.convert('RGB'))
# OCR
max_medals = tool.image_to_string(max_medals_img, lang='eng', builder=pyocr.builders.DigitBuilder(tesseract_layout=8))
#Entfernen Sie nicht numerische Zeichen
max_medals = re.sub(r'\D', '', max_medals)
print(f'max_medals:{max_medals}')
Nachdem ich verschiedene Größen ausprobiert hatte, wurde die Erkennungsrate des Grafikbildes, das ich mit diesem Code hatte, 100%!
Infolgedessen war es besser, die beste Methode für die Schnittgröße zu finden, als über Logik nachzudenken (lacht).
Wenn Sie die Zeichen nicht gut erkennen können
** Zweifle zuerst an dem Bild> Überprüfe die Einstellungen usw.> Passe es an, indem du eine weitere Logik hinzufügst **
Ich denke, es wird schwieriger sein, süchtig zu werden, wenn Sie in dieser Reihenfolge arbeiten.
Dieses Mal ist es äußerst genau, OCR, obwohl es nur numerische Werte erkennt.
Zeichenerkennung mit Python und Tesseract OCR So führen Sie OCR in Python aus
Recommended Posts