Cititorii ca tine ajută la sprijinirea MUO. Când efectuați o achiziție folosind link-uri de pe site-ul nostru, este posibil să câștigăm un comision de afiliat. Citeşte mai mult.

Poate doriți să digitizați un document pentru a economisi spațiu fizic sau să creați o copie de rezervă pentru salvare. Oricum, scrierea unui program care poate converti fotografiile fișierelor de hârtie într-un format standard este o sarcină la care excelează Python.

Folosind o combinație de biblioteci adecvate, puteți crea o aplicație mică pentru a digitiza documente. Programul dumneavoastră va prelua o imagine a unui document fizic ca intrare, îi va aplica mai multe tehnici de procesare a imaginii și va scoate o versiune scanată a intrării.

Pregătiți-vă mediul

Pentru a urma acest articol, ar trebui să fii familiarizat cu elementele de bază ale Python. De asemenea, trebuie să înțelegeți cum să lucrați cu biblioteca NumPy Python.

Deschideți orice IDE Python și creați două fișiere Python. Numiți unul main.py și celălalt transform.py. Apoi rulați următoarea comandă pe terminal pentru a instala bibliotecile necesare.

instagram viewer

pip install OpenCV-Python imutils scikit-image NumPy

Veți folosi OpenCV-Python pentru a prelua imaginea și pentru a efectua unele procesări de imagine. Imutils pentru a redimensiona imaginile de intrare și de ieșire. scikit-image pentru a aplica un prag imaginii. NumPy vă va ajuta să lucrați cu matrice.

Așteptați ca instalarea să se termine și ca IDE-ul să actualizeze scheletele proiectului. După ce actualizarea scheletelor este completă, sunteți gata să începeți codarea. Codul sursă complet este disponibil în a Depozitul GitHub.

Importarea bibliotecilor instalate

Deschideți fișierul main.py și importați bibliotecile pe care le-ați instalat în mediu. Acest lucru vă va permite să apelați și să utilizați funcțiile lor acolo unde este necesar.

import cv2
import imutils
din skimage.filtre import prag_local
din transforma import transformare_perspectivă

Ignorați eroarea aruncată pe perspective_transform. Va dispărea când veți termina de lucrat la fișierul transform.py.

Preluarea și redimensionarea intrării

Realizați o imagine clară a documentului pe care doriți să îl scanați. Asigurați-vă că cele patru colțuri ale documentului și conținutul acestuia sunt vizibile. Copiați imaginea în același folder în care stocați fișierele de program.

Transmite calea imaginii de intrare către OpenCV. Faceți o copie a imaginii originale, deoarece veți avea nevoie de ea în timpul transformării perspectivei. Împărțiți înălțimea imaginii originale la înălțimea la care doriți să o redimensionați. Acest lucru va menține raportul de aspect. În cele din urmă, scoateți imaginea redimensionată.

# Trecerea căii imaginii
original_img = cv2.imread(„sample.jpg”)
copie = original_img.copy()

# Înălțimea redimensionată în sute
raport = original_img.shape[0] / 500.0
img_resize = imutils.resize (original_img, height=500)

# Afișează rezultatul
cv2.imshow(„Imagine redimensionată”, img_resize)

# Așteptați ca utilizatorul să apese orice tastă
cv2.waitKey(0)

Ieșirea codului de mai sus este după cum urmează:

Acum ați redimensionat înălțimea imaginii originale la 500 de pixeli.

Conversia imaginii redimensionate în tonuri de gri

Convertiți imaginea RGB redimensionată în tonuri de gri. Majoritatea bibliotecilor de procesare a imaginilor funcționează numai cu imagini în tonuri de gri, deoarece sunt mai ușor de procesat.

grey_image = cv2.cvtColor (img_resize, cv2.COLOR_BGR2GRAY)
cv2.imshow(„Imagine gri”, imagine_gri)
cv2.waitKey(0)

Observați diferența dintre imaginea originală și cea gri.

Tabelul colorat a devenit alb-negru.

Aplicarea unui detector de margini

Aplicați un filtru de estompare Gaussian pe imaginea gri pentru a elimina zgomotul. Apoi apelați funcția OpenCV canny pentru a detecta marginile prezente în imagine.

imagine_încețoșată = cv2.GaussianBlur (imagine_gri, (5, 5), 0)
edged_img = cv2.Canny (imagine_încețoșată, 75, 200)
cv2.imshow(„Marginile imaginii”, edge_img)
cv2.waitKey(0)

Marginile sunt vizibile la ieșire.

Marginile cu care vei lucra sunt cele ale documentului.

Găsirea celui mai mare contur

Detectează contururile prezente în imaginea cu margini. Sortați-le în ordine descrescătoare păstrând doar cele cinci contururi cele mai mari. Aproximați cel mai mare contur cu patru laturi prin bucla prin contururile sortate.

cnts, _ = cv2.findContours (edged_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = sortat (cnts, key=cv2.contourArea, reverse=Adevărat)[:5]

pentru c în cnts:
peri = cv2.arcLength (c, Adevărat)
aproximativ = cv2.approxPolyDP(c, 0.02 *peri, Adevărat)

dacă len (aproximativ) == 4:
doc = aprox
pauză

Conturul cu patru laturi este probabil să conțină documentul.

Încercuirea celor patru colțuri ale conturului documentului

Încercuiește colțurile conturului documentului detectat. Acest lucru vă va ajuta să determinați dacă programul dvs. a fost capabil să detecteze documentul din imagine.

p = []

pentru d în doc:
tuple_point = tuplu (d[0])
cv2.circle (img_resize, tuple_point, 3, (0, 0, 255), 4)
p.append (punct_tuplu)

cv2.imshow(„Puncte de colț încercuite”, img_resize)
cv2.waitKey(0)

Implementați încercuirea imaginii RGB redimensionate.

După ce ați detectat documentul, acum trebuie să extrageți documentul din imagine.

Utilizarea Warp Perspective pentru a obține imaginea dorită

Perspectiva warp este o tehnică de viziune computerizată pentru transformarea unei imagini pentru a corecta distorsiunile. Transformă o imagine într-un plan diferit, permițându-vă să vizualizați imaginea dintr-un unghi diferit.

imagine_deformată = transformare_perspectivă (copy, doc.reshape(4, 2) * raport)
imagine_deformată = cv2.cvtColor (imagine_deformată, cv2.COLOR_BGR2GRAY)
cv2.imshow(„Imagine deformată”, imutils.resize (imagine_deformată, înălțime=650))
cv2.waitKey(0)

Pentru a obține o imagine deformată, trebuie creați un modul simplu care va realiza transformarea perspectivei.

Modul de transformare

Modulul va ordona punctele colțurilor documentului. De asemenea, va transforma imaginea documentului într-un plan diferit și va schimba unghiul camerei la o fotografie deasupra capului.

Deschideți fișierul transform.py pe care l-ați creat mai devreme. Importă biblioteci OpenCV și NumPy.

import numpy la fel de np
import cv2

Acest modul va conține două funcții. Creați o funcție care va ordona coordonatele punctelor de colț ale documentului. Prima coordonată va fi cea a colțului din stânga sus, a doua va fi cea a colțului din dreapta sus, a treia va fi din colțul din dreapta jos, iar a patra coordonată va fi cea din stânga jos colţ.

defpuncte_comandă(puncte):
# inițializarea listei de coordonate care urmează să fie comandate
rect = np.zeros((4, 2), dtype = "float32")

s = puncte.sumă (axa = 1)

# punct din stânga sus va avea cea mai mică sumă
rect[0] = puncte[np.argmin (s)]

# punct din dreapta jos va avea cea mai mare sumă
rect[2] = puncte[np.argmax (s)]

calculând diferența dintre puncte, the
punctul din dreapta sus va avea cea mai mică diferență,
în timp ce partea din stânga jos va avea cea mai mare diferență
diff = np.diff (pt., axa = 1)
rect[1] = puncte[np.argmin (dif.)]
rect[3] = puncte[np.argmax (dif.)]

# returnează coordonatele comandate
întoarcere rect

Creați o a doua funcție care va calcula coordonatele de colț ale noii imagini și va obține o fotografie deasupra capului. Apoi va calcula matricea de transformare a perspectivei și va returna imaginea deformată.

deftransformare_perspectivă(imagine, puncte):
# despachetați individual coordonatele comandate
rect = order_points (pts)
(tl, tr, br, bl) = rect

calculați lățimea noii imagini, care va fi
distanța maximă dintre dreapta jos și stânga jos
coordonatele x sau sus-dreapta și coordonatele x din stânga sus
lățimeA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
lățimeB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max (int (lățimeA), int (lățimeB))

calculați înălțimea noii imagini, care va fi
distanța maximă dintre partea din stânga sus și coordonatele y din stânga jos
înălțimeA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
înălțimeB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maxHeight = max (int (înălțimea A), int (înălțimea B))

construiți setul de puncte de destinație pentru a obține o fotografie de deasupra capului
dst = np.array([
[0, 0],
[lățimea maximă - 1, 0],
[lățimea maximă - 1, înălțime max - 1],
[0, înălțime max - 1]], dtype = "float32")

# calculați matricea transformării perspectivei
transform_matrix = cv2.getPerspectiveTransform (rect, dst)

# Aplicați matricea de transformare
warped = cv2.warpPerspective (imagine, transform_matrix, (maxWidth, maxHeight))

# returnează imaginea deformată
întoarcere Incovoiat

Acum ați creat modulul de transformare. Eroarea la importul perspective_transform va dispărea acum.

Observați că imaginea afișată are o fotografie deasupra capului.

Aplicarea pragului adaptiv și salvarea rezultatului scanat

În fișierul main.py, aplicați pragul gaussian imaginii deformate. Acest lucru va oferi imaginii deformate un aspect scanat. Salvați imaginea scanată în folderul care conține fișierele programului.

T = threshold_local (warped_image, 11, offset=10, metoda="gaussian")
warped = (warped_image > T).astype("uint8") * 255
cv2.imwrite('./'+"scanare"+„.png”,Incovoiat)

Salvarea scanării în format PNG menține calitatea documentului.

Afișarea ieșirii

Ieșiți imaginea documentului scanat:

cv2.imshow(„Imaginea scanată finală”, imutils.resize (deformat, înălțime=650))
cv2.waitKey(0)
cv2.destroyAllWindows()

Următoarea imagine arată rezultatul programului, o imagine de sus a documentului scanat.

Cum să avansezi în viziunea computerizată

Crearea unui scanner de documente acoperă unele domenii de bază ale vederii computerizate, care este un domeniu larg și complex. Pentru a avansa în viziunea computerizată, ar trebui să lucrați la proiecte interesante, dar provocatoare.

De asemenea, ar trebui să citiți mai multe despre cum puteți utiliza viziunea computerizată cu tehnologiile actuale. Acest lucru vă va ține informat și vă va oferi idei noi pentru proiecte la care să lucrați.