Schneiden Sie ein Bild mit Python aus

Eine Aufzeichnung des Kampfes, um herauszufinden, was mit Python und OCR getan werden kann (Tesseract-OCR wird für OCR verwendet)

Lesen wir zunächst ein ganzes Blatt des zu lesenden Objekts Da ich mich sehr bemühe, Dinge wie Briefmarken und Fotos zu lesen, verstehe ich die Bedeutung nicht Selbst wenn ich es lesen kann, kenne ich die Unterbrechung zwischen Daten nicht Aus diesem Grund ist es nutzlos. Deshalb habe ich beschlossen, nur die notwendigen Teile auszuschneiden und zu lesen.

Wenn Sie den folgenden Code schreiben, können Sie ihn an einer beliebigen Stelle in der Bilddatei platzieren Sie können das ausgeschnittene Bild unter einem anderen Namen ausschneiden und speichern.

   from PIL import Image

Bild mit PIL öffnen

img_trim = Image.open ('Name der Originalbilddatei') #Schneiden Sie die angegebenen Koordinaten aus img_trim.crop ((x1, y1, x2, y2)). save ('Name des zugeschnittenen Bildes speichern')

Bei dieser Geschwindigkeit müssen die Koordinaten viele Male angepasst werden, um das gewünschte Teil auszuschneiden. Erstellen wir eine Anwendung, die Koordinaten durch Betätigen der Maus erfasst, um die Arbeit beim Schleichen von Koordinaten zu optimieren. Es gibt verschiedene Möglichkeiten, eine GUI wie C # und VB zu erstellen, aber dieses Mal werde ich einen Mechanismus zum Erstellen einer Python-GUI namens Kivy ausprobieren. Die Installationsarbeiten sollten durch Installation von Kivy mit Pip durchgeführt worden sein. .. .. (Details weggelassen)

UI-Teiledefinition (main.kv):

#:import hex_color kivy.utils.get_color_from_hex
<ImageWidget>:
    canvas.before:
    Color:
        rgb: 1,1,1
    Rectangle:
        pos: self.pos
        size: self.size
BoxLayout:
    orientation: 'horizontal'
    height: root.height
    width: root.width

    Image:
        id: img
        allow_stretch: True
        source: root.image_src

    BoxLayout:
        size: root.size
        orientation: 'vertical'
        width: 200

        Label:
            id: lbl_file_name
            color: 0, 0, 0, 1
            font_size: 20
            background_color: hex_color('#000000')
        Label:
            id: lbl_result
            color: 0, 0, 0, 1
            font_size: 20

Es ist wie eine vereinfachte Version von HTML geschrieben Dann die Quelle des Hauptkörpers (main.py):

from kivy.app import App

aus kivy.core.text importieren LabelBase, DEFAULT_FONT #Addition from kivy.config import Config aus kivy.resources importiere resource_add_path #addition from kivy.properties import StringProperty from kivy.uix.widget import Widget from kivy.graphics import Line from kivy.graphics import Color from kivy.utils import get_color_from_hex from PIL import Image import math import os import pyocr import pyocr.builders

resource_add_path ('c: / Windows / Fonts') #Addition LabelBase.register (DEFAULT_FONT, 'msgothic.ttc') #Addition

Config.set('graphics', 'width', '1224')
Config.set('graphics', 'height', '768')  # 16:9

class ImageWidget(Widget):
    image_src = StringProperty('')

def __init__(self, **kwargs):
    super().__init__(**kwargs)
    self.image_src = 'read_img/0112-3.png'

self.ids.lbl_file_name.text = "Dateiname: \ n {}" .format (self.image_src) self.lines = []

def on_touch_down(self, touch):
    self.x1 = touch.x
    self.y1 = touch.y
    self.x2 = None
    self.y2 = None

def on_touch_move(self, touch):
    img = self.ids.img
    if touch.x > img.width:
        self.x2 = img.width
    else:
        self.x2 = touch.x
    if touch.y > img.height:
        self.y2 = 0
    else:
        self.y2 = touch.y

    for line in self.lines:
        self.canvas.remove(line)
    self.lines = []

    with self.canvas:

#Einstellungen für rote Linie Color(100, 0, 0) touch.ud['line'] = Line(points=[self.x1, self.y1, self.x2, self.y1, self.x2, self.y2, self.x1, self.y2], close='True') self.lines.append(touch.ud['line'])

Einstellung, um eine gestrichelte Linie zu machen

        Color(1, 1, 1)
        touch.ud['line'] = Line(points=[self.x1, self.y1, self.x2, self.y1,
                                        self.x2, self.y2, self.x1, self.y2],
                                dash_offset=5, dash_length=3,
                                close='True')
        self.lines.append(touch.ud['line'])

def on_touch_up(self, touch):

Beenden, wenn das Ereignis # touch_move nicht aufgetreten ist if self.x2 is None: return

Initialisierungsprozess:

Holen Sie sich ein IMG-Objekt

    img = self.ids.img

Finden Sie die Größe des Bildes in der Größe:

    vs = img.norm_image_size

Bild mit PIL öffnen

    img_trim = Image.open(self.image_src)

Ermitteln Sie die Größe des Bildes

    rs = img_trim.size

Bildskalierung berechnen

    ratio = rs[0] / vs[0]

Ermitteln Sie den Wert der angewendeten Polsterung:

MEMO Angenommene Ausrichtung der Mitte (Bildobjektgröße - Anzeigegröße) / 2

    px = 0
    py = 0
    if img.width > vs[0]:
        px = (img.width - vs[0]) / 2
    if img.height > vs[1]:
        py = (img.height - vs[1]) / 2

Entfernen Sie die Polsterung von IMG-Objekten

    x1 = (self.x1 - px) * ratio
    x2 = (self.x2 - px) * ratio
    y1 = (img.height - self.y1 - py) * ratio
    y2 = (img.height - self.y2 - py) * ratio

Sortieren Sie die Koordinaten der Ausschnittposition von klein nach groß

    if x1 < x2:
        real_x1 = math.floor(x1)
        real_x2 = math.ceil(x2)
    else:
        real_x1 = math.floor(x2)
        real_x2 = math.ceil(x1)
    if y1 < y2:
        real_y1 = math.floor(y1)
        real_y2 = math.ceil(y2)
    else:
        real_y1 = math.floor(y2)
        real_y2 = math.ceil(y1)

#Schneiden Sie die angegebenen Koordinaten aus img_trim.crop((real_x1, real_y1, real_x2, real_y2)).save('write_img/test.png')

#Lesen Sie den Text aus dem Bild self.read_image_to_string()

def read_image_to_string(self):
    try:

1. Übergeben Sie den installierten Tesseract-Pfad

        path_tesseract = r"C:\Program Files\Tesseract-OCR"
        if path_tesseract not in os.environ["PATH"].split(os.pathsep):
            os.environ["PATH"] += os.pathsep + path_tesseract

1. Erwerb der OCR-Engine

        tools = pyocr.get_available_tools()
        tool = tools[0]

2. Lesen Sie das Originalbild

        img = Image.open("write_img/test.png ")

3. OCR-Ausführung

        builder = pyocr.builders.TextBuilder(tesseract_layout=6)
        result = tool.image_to_string(img, lang="jpn", builder=builder)

self.ids.lbl_result.text = f "Leseergebnis: \ n {Ergebnis}" print(result) except Exception as ex: print(ex) self.ids.lbl_result.text = f "Leseergebnis: \ nFehler"

class MainApp(App):
    def __init__(self, **kwargs):
        super(MainApp, self).__init__(**kwargs)

self.title = 'test'

def build(self):
    return ImageWidget()

if __name__ == '__main__':
    app = MainApp()
    app.run()

Programmablauf: Holen Sie sich den Punkt, auf den Sie geklickt haben, als Sie geklickt haben Zeichnen Sie den quadratischen Rahmen beim Ziehen weiter Holen Sie sich die Endkoordinaten, wenn Sie nicht geklickt haben Das Ausschneiden des Bildes und das Lesen des Bildes durch OCR wird ausgeführt.

Punkt: Angeklickte Koordinaten auf dem Bildschirm können nicht verwendet werden, selbst wenn sie auf das Originalbild angewendet werden Es ist notwendig, die tatsächlichen Koordinaten unter Berücksichtigung des Kontrasts zu berechnen Es ist zu berücksichtigen, dass das Bildobjekt auf der GUI Auffüllungen enthält. Es ist auch zu beachten, dass die Ziehrichtung der Maus oben links umgeben ist

Als Ergebnis des Lesens von OCR, ... Nicht sehr genau, wenn es ohne Anpassung ausgeführt wird Es scheint, dass wir die Parameter anpassen und verschiedene Dinge tun können. Erstens kann es ein Problem mit der Leistung von OCR geben. In Zukunft möchte ich eine OCR-Engine usw. auswählen.

Recommended Posts

Schneiden Sie ein Bild mit Python aus
Schneiden Sie das Gesicht mit Python + OpenCV aus
Bildverarbeitung mit Python
So beschneiden Sie ein Bild mit Python + OpenCV
Erstellen Sie ein Bild mit Zeichen mit Python (Japanisch)
Bildverarbeitung mit Python (Teil 2)
Bildbearbeitung mit Python OpenCV
Ein Ei mit Python erstellen
Sortieren von Bilddateien mit Python (2)
Sortieren von Bilddateien mit Python (3)
Bildverarbeitung mit Python (Teil 1)
Tweet mit Bild in Python
Bilddateien mit Python sortieren
Bildverarbeitung mit Python (3)
[Python] Bildverarbeitung mit Scicit-Image
[Python] Verwenden von OpenCV mit Python (Bildfilterung)
[Python] Verwenden von OpenCV mit Python (Bildtransformation)
Die Bildverarbeitung mit Python 100 klopft an die Binärisierung Nr. 3
Ich habe eine SMS mit Python gesendet
Lassen Sie uns mit Python Image Scraping durchführen
Finden Sie Bildähnlichkeit mit Python + OpenCV
100 Bildverarbeitung mit Python Knock # 2 Graustufen
Zeichnen Sie eine Illustration mit Python + OpenCV
[Python] Mail mit Outlook senden
Sende Bild mit Python und speichere mit PHP
Schneiden Sie mit Python + OpenCV jede Sekunde ein Bild aus einem Video aus
Erzeugung von Verlaufsbildern mit Python [1] | np.linspace
Versuchen Sie, mit Python3 eine Zeichenfolge aus einem Bild zu extrahieren
[Python] Ich habe einen Bildbetrachter mit einer einfachen Sortierfunktion erstellt.
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Grundlagen der binärisierten Bildverarbeitung durch Python
Bildverarbeitung mit Python 100 Knock # 10 Medianfilter
[Python] Erstellen einer Umgebung mit Anaconda [Mac]
Erstellen einer Bildaufteilungs-App mit Tkinter
HTML-Mail mit Bild zum Senden mit Python
Erstellen Sie mit PySimpleGUI einen Bildverarbeitungs-Viewer
Erstellen Sie mit Python + PIL ein Dummy-Image.
100 Bildverarbeitung mit Python Knock # 8 Max Pooling
Hinweise beim Erstellen einer Umgebung mit Python
Einführung in das Auffüllen von Python-Bildern Auffüllen von Bildern mit ImageDataGenerator
Erstellen Sie schnell eine Excel-Datei mit Python #python
Verwenden Sie die Verschlüsselung der Verschlüsselungsbibliothek mit dem Python-Image von Docker
Bildverarbeitung mit Python & OpenCV [Tonkurve]
Bildverarbeitung mit Python 100 Knock # 12 Bewegungsfilter
Bildaufnahme von der Kamera mit Python + OpenCV
[Python] Erstellen Sie schnell eine API mit Flask
Zeichnen mit Matrix-Reinventor von Python Image Processing-
Scraping von einer authentifizierten Site mit Python
Verarbeiten Sie Bilder in Python ganz einfach mit Pillow
Erstellen Sie eine englische Wort-App mit Python
Die Bildverarbeitung mit Python 100 führt zu einem durchschnittlichen Pooling von # 7
Senden Sie eine E-Mail mit Amazon SES + Python
Treten Sie einem Online-Richter mit Python 3.x bei
Schneiden Sie Bilder aus und verbinden Sie sie mit ImageMagick
Versuchen Sie, ein Bild mit Entfremdung zu erzeugen
Leichte Bildverarbeitung mit Python x OpenCV
Lassen Sie uns mit Python 1 einen Investitionsalgorithmus entwickeln