Ίσως θέλετε να ψηφιοποιήσετε ένα έγγραφο για να εξοικονομήσετε φυσικό χώρο ή να δημιουργήσετε ένα αντίγραφο ασφαλείας. Είτε έτσι είτε αλλιώς, η σύνταξη ενός προγράμματος που μπορεί να μετατρέψει φωτογραφίες των χάρτινων αρχείων σας σε τυπική μορφή είναι μια εργασία στην οποία υπερέχει η Python.
Χρησιμοποιώντας έναν συνδυασμό κατάλληλων βιβλιοθηκών, μπορείτε να δημιουργήσετε μια μικρή εφαρμογή για την ψηφιοποίηση εγγράφων. Το πρόγραμμά σας θα λάβει μια εικόνα ενός φυσικού εγγράφου ως είσοδο, θα εφαρμόσει διάφορες τεχνικές επεξεργασίας εικόνας σε αυτό και θα εξάγει μια σαρωμένη έκδοση της εισόδου.
Προετοιμασία του Περιβάλλοντος σας
Για να ακολουθήσετε αυτό το άρθρο θα πρέπει να είστε εξοικειωμένοι με το βασικά της Python. Πρέπει επίσης να κατανοήσετε πώς να εργαστείτε με τη βιβλιοθήκη NumPy Python.
Ανοίξτε οποιοδήποτε Python IDE και δημιουργήστε δύο αρχεία Python. Ονομάστε το ένα main.py και το άλλο transform.py. Στη συνέχεια, εκτελέστε την ακόλουθη εντολή στο τερματικό για να εγκαταστήσετε τις απαιτούμενες βιβλιοθήκες.
εγκατάσταση pip OpenCV-Python immutils scikit-image NumPy
Θα χρησιμοποιήσετε το OpenCV-Python για να εισαγάγετε την εικόνα και να εκτελέσετε κάποια επεξεργασία εικόνας. Imutils για αλλαγή μεγέθους των εικόνων εισόδου και εξόδου. scikit-image για να εφαρμόσετε ένα όριο στην εικόνα. Το NumPy θα σας βοηθήσει να εργαστείτε με πίνακες.
Περιμένετε να ολοκληρωθεί η εγκατάσταση και να ενημερώσει το IDE τους σκελετούς του έργου. Αφού ολοκληρωθεί η ενημέρωση των σκελετών, είστε έτοιμοι να ξεκινήσετε την κωδικοποίηση. Ο πλήρης πηγαίος κώδικας είναι διαθέσιμος σε α Αποθετήριο GitHub.
Εισαγωγή των εγκατεστημένων βιβλιοθηκών
Ανοίξτε το αρχείο main.py και εισαγάγετε τις βιβλιοθήκες που εγκαταστήσατε στο περιβάλλον. Αυτό θα σας επιτρέψει να καλέσετε και να χρησιμοποιήσετε τις λειτουργίες τους όπου χρειάζεται.
εισαγωγή cv2
εισαγωγή imutils
από skimage.φίλτρα εισαγωγή threshold_local
από μεταμορφώνω εισαγωγή προοπτική_μεταμόρφωση
Αγνοήστε το σφάλμα που παρουσιάστηκε στο view_transform. Θα εξαφανιστεί όταν ολοκληρώσετε την εργασία στο αρχείο transform.py.
Λήψη και αλλαγή μεγέθους της εισόδου
Τραβήξτε μια καθαρή εικόνα του εγγράφου που θέλετε να σαρώσετε. Βεβαιωθείτε ότι οι τέσσερις γωνίες του εγγράφου και τα περιεχόμενά του είναι ορατά. Αντιγράψτε την εικόνα στον ίδιο φάκελο που αποθηκεύετε τα αρχεία του προγράμματος.
Περάστε τη διαδρομή εικόνας εισόδου στο OpenCV. Δημιουργήστε ένα αντίγραφο της αρχικής εικόνας καθώς θα το χρειαστείτε κατά τη μετατροπή της προοπτικής. Διαιρέστε το ύψος της αρχικής εικόνας με το ύψος στο οποίο θέλετε να αλλάξετε το μέγεθός της. Αυτό θα διατηρήσει την αναλογία διαστάσεων. Τέλος, εξάγετε την εικόνα με αλλαγή μεγέθους.
# Πέρασμα της διαδρομής εικόνας
original_img = cv2.imread('sample.jpg')
copy = original_img.copy()# Το ύψος έχει αλλάξει σε εκατοντάδες
αναλογία = original_img.shape[0] / 500.0
img_resize = imutils.resize (original_img, ύψος=500)# Εμφάνιση εξόδου
cv2.imshow('Αλλαγή μεγέθους εικόνας', img_resize)
# Αναμονή να πατήσει ο χρήστης οποιοδήποτε πλήκτρο
cv2.waitKey(0)
Η έξοδος του παραπάνω κώδικα είναι η εξής:
Τώρα αλλάξατε το μέγεθος της αρχικής εικόνας στα 500 pixel.
Μετατροπή της αλλαγής μεγέθους εικόνας σε κλίμακα του γκρι
Μετατρέψτε την εικόνα RGB με αλλαγή μεγέθους σε κλίμακα του γκρι. Οι περισσότερες βιβλιοθήκες επεξεργασίας εικόνας λειτουργούν μόνο με εικόνες σε κλίμακα του γκρι, καθώς είναι πιο εύκολο να επεξεργαστούν.
gray_image = cv2.cvtColor (img_resize, cv2.COLOR_BGR2GRAY)
cv2.imshow("Γκρι εικόνα", γκρι_εικόνα)
cv2.waitKey(0)
Παρατηρήστε τη διαφορά μεταξύ της αρχικής εικόνας και της γκριζαρισμένης εικόνας.
Το χρωματιστό τραπέζι έχει γίνει ασπρόμαυρο.
Εφαρμογή ανιχνευτή ακμών
Εφαρμόστε ένα φίλτρο Gaussian blur στην γκρι εικόνα για να αφαιρέσετε το θόρυβο. Στη συνέχεια, καλέστε τη λειτουργία OpenCV canny για να εντοπίσετε τις άκρες που υπάρχουν στην εικόνα.
blurred_image = cv2.GaussianBlur (γκρι_εικόνα, (5, 5), 0)
edged_img = cv2.Canny (θολή_εικόνα, 75, 200)
cv2.imshow('άκρες εικόνας', edged_img)
cv2.waitKey(0)
Οι άκρες είναι ορατές στην έξοδο.
Οι άκρες με τις οποίες θα εργαστείτε είναι αυτές του εγγράφου.
Εύρεση του μεγαλύτερου περιγράμματος
Εντοπίστε τα περιγράμματα που υπάρχουν στην εικόνα με άκρα. Ταξινομήστε τα με φθίνουσα σειρά διατηρώντας μόνο τα πέντε μεγαλύτερα περιγράμματα. Προσεγγίστε το μεγαλύτερο περίγραμμα με τέσσερις πλευρές περνώντας θηλιά μέσα από τα ταξινομημένα περιγράμματα.
cnts, _ = cv2.findContours (edged_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = ταξινομημένο (cnts, key=cv2.contourArea, reverse=Αληθής)[:5]Για ντο σε cnts:
peri = cv2.arcLength (c, Αληθής)
περίπου = cv2.approxPolyDP(c, 0.02 * περί, Αληθής)
αν λεν (περίπου) == 4:
doc = περίπου
Διακοπή
Το περίγραμμα με τις τέσσερις πλευρές είναι πιθανό να περιέχει το έγγραφο.
Κυκλώνοντας τις τέσσερις γωνίες του περιγράμματος του εγγράφου
Κυκλώστε τις γωνίες του περιγράμματος του εγγράφου που εντοπίστηκε. Αυτό θα σας βοηθήσει να προσδιορίσετε εάν το πρόγραμμά σας ήταν σε θέση να εντοπίσει το έγγραφο στην εικόνα.
p = []
Για ρε σε doc:
πλειάδα_σημείο = πλειάδα (δ[0])
cv2.circle (img_resize, tuple_point, 3, (0, 0, 255), 4)
p.append (tuple_point)
cv2.imshow("Κυκλωμένα γωνιακά σημεία", img_resize)
cv2.waitKey(0)
Εφαρμογή κύκλου στην εικόνα RGB με αλλαγή μεγέθους.
Έχοντας εντοπίσει το έγγραφο, πρέπει τώρα να εξαγάγετε το έγγραφο από την εικόνα.
Χρήση Warp Perspective για λήψη της επιθυμητής εικόνας
Η προοπτική Warp είναι μια τεχνική όρασης υπολογιστή για τη μετατροπή μιας εικόνας για τη διόρθωση παραμορφώσεων. Μετατρέπει μια εικόνα σε διαφορετικό επίπεδο επιτρέποντάς σας να δείτε την εικόνα από διαφορετική γωνία.
warped_image = perspektiva_transform (αντιγραφή, doc.reshape(4, 2) * αναλογία)
warped_image = cv2.cvtColor (warped_image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Στρεβλωμένη εικόνα", imutils.resize (warped_image, height=650))
cv2.waitKey(0)
Για να αποκτήσετε μια στρεβλή εικόνα, πρέπει δημιουργήστε μια απλή ενότητα που θα εκτελέσει τον μετασχηματισμό της προοπτικής.
Ενότητα Μετασχηματισμού
Η ενότητα θα παραγγείλει τα σημεία των γωνιών του εγγράφου. Θα μετατρέψει επίσης την εικόνα του εγγράφου σε διαφορετικό επίπεδο και θα αλλάξει τη γωνία της κάμερας σε μια λήψη από πάνω.
Ανοίξτε το αρχείο transform.py που δημιουργήσατε νωρίτερα. Εισαγάγετε βιβλιοθήκες OpenCV και NumPy.
εισαγωγή μουδιασμένος όπως και np
εισαγωγή cv2
Αυτή η ενότητα θα περιέχει δύο λειτουργίες. Δημιουργήστε μια συνάρτηση που θα ταξινομεί τις συντεταγμένες των γωνιακών σημείων του εγγράφου. Η πρώτη συντεταγμένη θα είναι αυτή της πάνω αριστερής γωνίας, η δεύτερη θα είναι αυτή της πάνω δεξιάς γωνίας, η τρίτη θα είναι της κάτω δεξιάς γωνίας και η τέταρτη συντεταγμένη θα είναι αυτή της κάτω αριστερής γωνίας γωνία.
deforder_points(βαθμοί):
# αρχικοποίηση της λίστας των προς παραγγελία συντεταγμένων
rect = np.zeros((4, 2), dtype = "float32")s = pts.sum (άξονας = 1)
# πάνω αριστερά σημείο θα έχει το μικρότερο άθροισμα
ορθός[0] = πόντοι[np.argmin (s)]Το # κάτω δεξιά σημείο θα έχει το μεγαλύτερο άθροισμα
ορθός[2] = πόντοι[np.argmax (s)]υπολογίζοντας τη διαφορά μεταξύ των σημείων, το
πάνω δεξιά το σημείο θα έχει τη μικρότερη διαφορά,
ενώ η κάτω αριστερά θα έχει τη μεγαλύτερη διαφορά
diff = np.diff (πόντους, άξονας = 1)
ορθός[1] = πόντοι[np.argmin (διαφορά)]
ορθός[3] = πόντοι[np.argmax (διαφορά)]
# επιστρέφει διατεταγμένες συντεταγμένες
ΕΠΙΣΤΡΟΦΗ ορθός
Δημιουργήστε μια δεύτερη συνάρτηση που θα υπολογίσει τις γωνιακές συντεταγμένες της νέας εικόνας και θα λάβει μια γενική λήψη. Στη συνέχεια, θα υπολογίσει τον πίνακα μετασχηματισμού προοπτικής και θα επιστρέψει τη στρεβλή εικόνα.
defπροοπτική_μεταμόρφωση(εικόνα, βαθμοί):
# αποσυσκευάστε τις παραγγελθείσες συντεταγμένες ξεχωριστά
rect = order_points (βαθμοί)
(tl, tr, br, bl) = ορθυπολογίστε το πλάτος της νέας εικόνας, το οποίο θα είναι το
μέγιστη απόσταση μεταξύ κάτω δεξιά και κάτω αριστερά
x-συντεταγμένες ή πάνω δεξιά και πάνω αριστερά συντεταγμένες x
widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
πλάτοςB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max (int (widthA), int (widthB))υπολογίστε το ύψος της νέας εικόνας, το οποίο θα είναι το
μέγιστη απόσταση μεταξύ πάνω-αριστερά και κάτω αριστερά συντεταγμένες y
ύψοςA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
ύψοςB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maxHeight = max (int (ύψος A), int (ύψος Β))κατασκευάστε το σύνολο των σημείων προορισμού για να λάβετε μια βολή από πάνω
dst = np.array([
[0, 0],
[maxWidth - 1, 0],
[maxWidth - 1, μέγιστο ύψος - 1],
[0, μέγιστο ύψος - 1]], dtype = "float32")# υπολογίστε τον πίνακα μετασχηματισμού προοπτικής
transform_matrix = cv2.getPerspectiveTransform (rect, dst)# Εφαρμόστε τον πίνακα μετασχηματισμού
warped = cv2.warpPerspective (image, transform_matrix, (maxWidth, maxHeight))
# επιστρέψτε τη στρεβλή εικόνα
ΕΠΙΣΤΡΟΦΗ στραβωμένος
Τώρα δημιουργήσατε τη μονάδα μετασχηματισμού. Το σφάλμα στην εισαγωγή perspektive_transform θα εξαφανιστεί τώρα.
Παρατηρήστε ότι η εικόνα που εμφανίζεται έχει μια υπερκείμενη λήψη.
Εφαρμογή Adaptive Threshold και αποθήκευση της σαρωμένης εξόδου
Στο αρχείο main.py, εφαρμόστε το όριο Gaussian στην παραμορφωμένη εικόνα. Αυτό θα δώσει στη στρεβλωμένη εικόνα μια σαρωμένη εμφάνιση. Αποθηκεύστε την έξοδο της σαρωμένης εικόνας στο φάκελο που περιέχει τα αρχεία προγράμματος.
T = threshold_local (warped_image, 11, μετατόπιση=10, μέθοδος="gaussian")
warped = (warped_image > T).atype("uint8") * 255
cv2.imwrite('./'+'σάρωση'+".png",στραβωμένος)
Η αποθήκευση της σάρωσης σε μορφή PNG διατηρεί την ποιότητα του εγγράφου.
Εμφάνιση της Εξόδου
Εξαγωγή της εικόνας του σαρωμένου εγγράφου:
cv2.imshow("Τελική σαρωμένη εικόνα", imutils.resize (στρέβλωση, ύψος=650))
cv2.waitKey(0)
cv2.destroyAllWindows()
Η παρακάτω εικόνα δείχνει την έξοδο του προγράμματος, μια γενική λήψη του σαρωμένου εγγράφου.
Πώς να προχωρήσετε στο Computer Vision
Η δημιουργία ενός σαρωτή εγγράφων καλύπτει ορισμένους βασικούς τομείς της όρασης του υπολογιστή, που είναι ένα ευρύ και πολύπλοκο πεδίο. Για να προχωρήσετε στην όραση υπολογιστών θα πρέπει να εργαστείτε σε ενδιαφέροντα αλλά προκλητικά έργα.
Θα πρέπει επίσης να διαβάσετε περισσότερα για το πώς μπορείτε να χρησιμοποιήσετε την όραση υπολογιστή με τις τρέχουσες τεχνολογίες. Αυτό θα σας κρατήσει ενήμερους και θα σας δώσει νέες ιδέες για έργα για να εργαστείτε.