Leser wie Sie helfen, MUO zu unterstützen. Wenn Sie über Links auf unserer Website einen Kauf tätigen, erhalten wir möglicherweise eine Affiliate-Provision. Weiterlesen.

Möglicherweise möchten Sie ein Dokument digitalisieren, um physischen Speicherplatz zu sparen, oder eine Sicherungskopie erstellen. Wie auch immer, das Schreiben eines Programms, das Fotos Ihrer Papierdateien in ein Standardformat umwandeln kann, ist eine Aufgabe, die Python hervorragend beherrscht.

Mit einer Kombination geeigneter Bibliotheken können Sie eine kleine App zum Digitalisieren von Dokumenten erstellen. Ihr Programm nimmt ein Bild eines physischen Dokuments als Eingabe, wendet mehrere Bildverarbeitungstechniken darauf an und gibt eine gescannte Version der Eingabe aus.

Vorbereiten Ihrer Umgebung

Um diesem Artikel folgen zu können, sollten Sie mit dem vertraut sein Grundlagen von Python. Sie müssen auch ein Verständnis dafür haben wie man mit der NumPy-Python-Bibliothek arbeitet.

Öffnen Sie eine beliebige Python-IDE und erstellen Sie zwei Python-Dateien. Nennen Sie eine main.py und die andere transform.py. Führen Sie dann den folgenden Befehl auf dem Terminal aus, um die erforderlichen Bibliotheken zu installieren.

instagram viewer

pip installiere OpenCV-Python imutils scikit-image NumPy

Sie verwenden OpenCV-Python, um die Bildeingabe zu übernehmen und eine Bildverarbeitung durchzuführen. Imutils zum Ändern der Größe der Eingabe- und Ausgabebilder. scikit-image, um einen Schwellenwert auf das Bild anzuwenden. NumPy hilft Ihnen bei der Arbeit mit Arrays.

Warten Sie, bis die Installation abgeschlossen ist und die IDE die Projektskelette aktualisiert hat. Nachdem das Skeleton-Update abgeschlossen ist, können Sie mit dem Codieren beginnen. Der vollständige Quellcode ist verfügbar in a GitHub-Repository.

Importieren der installierten Bibliotheken

Öffnen Sie die Datei main.py und importieren Sie die Bibliotheken, die Sie in der Umgebung installiert haben. Dadurch können Sie deren Funktionen bei Bedarf aufrufen und nutzen.

importieren Lebenslauf2
importieren Imutile
aus skimage.filters importieren Schwelle_lokal
aus verwandeln importieren perspektive_transformation

Ignorieren Sie den Fehler, der auf perspective_transform geworfen wird. Es verschwindet, wenn Sie die Arbeit an der transform.py-Datei beendet haben.

Übernehmen und Ändern der Größe der Eingabe

Machen Sie ein klares Bild des Dokuments, das Sie scannen möchten. Stellen Sie sicher, dass die vier Ecken des Dokuments und sein Inhalt sichtbar sind. Kopieren Sie das Bild in denselben Ordner, in dem Sie die Programmdateien speichern.

Übergeben Sie den Eingabebildpfad an OpenCV. Erstellen Sie eine Kopie des Originalbilds, da Sie es während der Perspektivtransformation benötigen. Teilen Sie die Höhe des Originalbildes durch die Höhe, auf die Sie die Größe ändern möchten. Dadurch wird das Seitenverhältnis beibehalten. Geben Sie schließlich das in der Größe geänderte Bild aus.

# Übergeben des Bildpfads
original_img = cv2.imread('Beispiel.jpg')
copy = original_img.copy()

# Die geänderte Höhe in Hunderten
ratio = original_img.shape[0] / 500.0
img_resize = imutils.resize (original_img, Höhe=500)

# Ausgabe anzeigen
cv2.imshow('Größe des Bildes geändert', img_resize)

# Warten, bis der Benutzer eine beliebige Taste drückt
cv2.waitKey(0)

Die Ausgabe des obigen Codes ist wie folgt:

Sie haben jetzt die Höhe des Originalbilds auf 500 Pixel geändert.

Konvertieren des skalierten Bildes in Graustufen

Konvertieren Sie das in der Größe geänderte RGB-Bild in Graustufen. Die meisten Bildverarbeitungsbibliotheken arbeiten nur mit Graustufenbildern, da diese einfacher zu verarbeiten sind.

grey_image = cv2.cvtColor (img_resize, cv2.COLOR_BGR2GRAY)
cv2.imshow('Graues Bild', graues_Bild)
cv2.waitKey(0)

Beachten Sie den Unterschied zwischen dem Originalbild und dem grauen Bild.

Der farbige Tisch ist schwarz-weiß geworden.

Anwenden eines Kantendetektors

Wenden Sie einen Gaußschen Unschärfefilter auf das graue Bild an, um Rauschen zu entfernen. Rufen Sie dann die Canny-Funktion von OpenCV auf, um die im Bild vorhandenen Kanten zu erkennen.

blurred_image = cv2.GaußianBlur (gray_image, (5, 5), 0)
edged_img = cv2.Canny (blurred_image, 75, 200)
cv2.imshow('Bildränder', edged_img)
cv2.waitKey(0)

Die Kanten sind auf der Ausgabe sichtbar.

Die Kanten, mit denen Sie arbeiten, sind die des Dokuments.

Finden der größten Kontur

Erkennen Sie die im kantigen Bild vorhandenen Konturen. Sortieren Sie sie in absteigender Reihenfolge und behalten Sie nur die fünf größten Konturen bei. Approximieren Sie die größte Kontur mit vier Seiten, indem Sie die sortierten Konturen durchlaufen.

cnts, _ = cv2.findContours (edged_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = sortiert (cnts, key=cv2.contourArea, reverse=WAHR)[:5]

für C In Punkte:
peri = cv2.arcLength (c, WAHR)
approx = cv2.approxPolyDP(c, 0.02 * peri, WAHR)

Wenn len (ungefähr) == 4:
dok = ca
brechen

Die Kontur mit vier Seiten enthält wahrscheinlich das Dokument.

Umrunden der vier Ecken der Dokumentenkontur

Kreisen Sie die Ecken der erkannten Dokumentenkontur ein. So können Sie feststellen, ob Ihr Programm das Dokument im Bild erkennen konnte.

p = []

für D In Dokument:
tuple_point = Tupel (d[0])
cv2.circle (img_resize, tuple_point, 3, (0, 0, 255), 4)
p.append (tuple_point)

cv2.imshow('Eingekreiste Eckpunkte', img_resize)
cv2.waitKey(0)

Implementieren Sie das Kreisen auf dem in der Größe geänderten RGB-Bild.

Nachdem Sie das Dokument erkannt haben, müssen Sie nun das Dokument aus dem Bild extrahieren.

Verwenden der Warp-Perspektive, um das gewünschte Bild zu erhalten

Warp-Perspektive ist eine Computer-Vision-Technik zum Transformieren eines Bildes, um Verzerrungen zu korrigieren. Es transformiert ein Bild in eine andere Ebene, sodass Sie das Bild aus einem anderen Blickwinkel betrachten können.

warped_image = perspective_transform (kopieren, doc.reshape(4, 2) * Verhältnis)
verzerrtes_Bild = cv2.cvtColor (verzerrtes_Bild, cv2.COLOR_BGR2GRAY)
cv2.imshow("Verzerrtes Bild", imutils.resize (verzerrtes_Bild, Höhe=650))
cv2.waitKey(0)

Um ein verzerrtes Bild zu erhalten, müssen Sie Erstellen Sie ein einfaches Modul Dadurch wird die perspektivische Transformation durchgeführt.

Transformationsmodul

Das Modul ordnet die Punkte der Dokumentenecken. Es wird auch das Dokumentenbild in eine andere Ebene umwandeln und den Kamerawinkel in eine Überkopfaufnahme ändern.

Öffnen Sie die zuvor erstellte transform.py-Datei. Importieren Sie OpenCV- und NumPy-Bibliotheken.

importieren taub als np
importieren Lebenslauf2

Dieses Modul enthält zwei Funktionen. Erstellen Sie eine Funktion, die die Koordinaten der Eckpunkte des Dokuments ordnet. Die erste Koordinate ist die der oberen linken Ecke, die zweite die der oberen rechten Ecke, die dritte ist die untere rechte Ecke, und die vierte Koordinate ist die untere linke Ecke.

defBestellpunkte(Punkte):
# Initialisieren der Liste der zu bestellenden Koordinaten
rect = np.zeros((4, 2), dtyp = "float32")

s = pts.sum (Achse = 1)

# oberer linker Punkt hat die kleinste Summe
recht[0] = pts[np.argmin (s)]

# unterer rechter Punkt hat die größte Summe
recht[2] = pts[np.argmax (s)]

Berechnung der Differenz zwischen den Punkten, die
der obere rechte Punkt hat den kleinsten Unterschied,
wohingegen die untere linke Seite den größten Unterschied aufweisen wird
diff = np.diff (pts, Achse = 1)
recht[1] = pts[np.argmin (diff)]
recht[3] = pts[np.argmax (diff)]

# gibt geordnete Koordinaten zurück
zurückkehren rechtwinkl

Erstellen Sie eine zweite Funktion, die die Eckkoordinaten des neuen Bildes berechnet und eine Overhead-Aufnahme erhält. Es berechnet dann die perspektivische Transformationsmatrix und gibt das verzerrte Bild zurück.

defperspektive_transformation(Bild, Punkte):
# die bestellten Koordinaten einzeln auspacken
rect = Bestellpunkte (Punkte)
(tl, tr, br, bl) = rekt

Berechnen Sie die Breite des neuen Bildes, die die sein wird
maximaler Abstand zwischen unten rechts Und unten links
x-Koordinaten oder oben rechts Und x-Koordinaten oben links
breiteA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max (int (BreiteA), int (BreiteB))

Berechnen Sie die Höhe des neuen Bildes, die die sein wird
maximaler Abstand zwischen oben links Und y-Koordinaten unten links
HöheA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
HöheB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maxHeight = max (int (HöheA), int (HöheB))

Konstruieren Sie den Satz von Zielpunkten, um eine Überkopfaufnahme zu erhalten
dst = np.array([
[0, 0],
[maximale Breite - 1, 0],
[maximale Breite - 1, maximale Höhe - 1],
[0, maximale Höhe - 1]], dtyp = "float32")

# Berechnen Sie die perspektivische Transformationsmatrix
transform_matrix = cv2.getPerspectiveTransform (rect, dst)

# Wenden Sie die Transformationsmatrix an
warped = cv2.warpPerspective (image, transform_matrix, (maxWidth, maxHeight))

# gibt das verzerrte Bild zurück
zurückkehren verzogen

Sie haben jetzt das Transformationsmodul erstellt. Der Fehler beim Import von perspective_transform verschwindet jetzt.

Beachten Sie, dass das angezeigte Bild eine Überkopfaufnahme hat.

Anwenden des adaptiven Schwellenwerts und Speichern der gescannten Ausgabe

Wenden Sie in der Datei main.py den Gaußschen Schwellenwert auf das verzerrte Bild an. Dadurch erhält das verzerrte Bild ein gescanntes Aussehen. Speichern Sie die gescannte Bildausgabe in dem Ordner, der die Programmdateien enthält.

T = Schwellenlokal (verzerrtes_Bild, 11, Versatz=10, Methode="Gauß")
warped = (warped_image > T).astype("uint8") * 255
cv2.imwrite('./'+'Scan'+'.png',verzogen)

Beim Speichern des Scans im PNG-Format bleibt die Dokumentqualität erhalten.

Anzeigen der Ausgabe

Bild des gescannten Dokuments ausgeben:

cv2.imshow("Endgültiges gescanntes Bild", imutils.resize (verzerrt, Höhe=650))
cv2.waitKey(0)
cv2.destroyAllWindows()

Das folgende Bild zeigt die Ausgabe des Programms, eine Draufsicht des gescannten Dokuments.

Wie man in Computer Vision vorankommt

Das Erstellen eines Dokumentenscanners deckt einige Kernbereiche der Computer Vision ab, die ein weites und komplexes Gebiet ist. Um in Computer Vision voranzukommen, sollten Sie an interessanten, aber herausfordernden Projekten arbeiten.

Lesen Sie auch mehr darüber, wie Sie Computer Vision mit aktuellen Technologien nutzen können. So bleiben Sie auf dem Laufenden und erhalten neue Ideen für Projekte, an denen Sie arbeiten können.