Možno budete chcieť digitalizovať dokument, aby ste ušetrili fyzický priestor, alebo vytvoriť zálohu. Tak či onak, napísanie programu, ktorý dokáže previesť fotografie vašich papierových súborov do štandardného formátu, je úloha, v ktorej Python exceluje.
Pomocou kombinácie vhodných knižníc môžete vytvoriť malú aplikáciu na digitalizáciu dokumentov. Váš program vezme obrázok fyzického dokumentu ako vstup, použije naň niekoľko techník spracovania obrazu a vytlačí naskenovanú verziu vstupu.
Príprava vášho prostredia
Ak chcete postupovať podľa tohto článku, mali by ste byť oboznámení s základy Pythonu. Musíte mať tiež pochopenie ako pracovať s knižnicou NumPy Python.
Otvorte akékoľvek Python IDE a vytvorte dva Python súbory. Pomenujte jednu main.py a druhú transform.py. Potom spustite nasledujúci príkaz na termináli a nainštalujte požadované knižnice.
pip install OpenCV-Python imutils scikit-image NumPy
OpenCV-Python použijete na zadanie obrazu a vykonanie určitého spracovania obrazu. Imutils na zmenu veľkosti vstupných a výstupných obrázkov. scikit-image, ak chcete na obrázok použiť prah. NumPy vám pomôže pracovať s poliami.
Počkajte, kým sa dokončí inštalácia a kým IDE aktualizuje kostry projektu. Po dokončení aktualizácie kostry ste pripravení začať s kódovaním. Úplný zdrojový kód je dostupný v a úložisko GitHub.
Import nainštalovaných knižníc
Otvorte súbor main.py a importujte knižnice, ktoré ste nainštalovali do prostredia. V prípade potreby vám to umožní volať a využívať ich funkcie.
importovať cv2
importovať imutils
od skimage.filtre importovať prahová_miestna
od transformovať importovať perspektíva_premena
Ignorujte chybu vyvolanú na perspective_transform. Po dokončení práce na súbore transform.py zmizne.
Prevzatie a zmena veľkosti vstupu
Vytvorte jasný obraz dokumentu, ktorý chcete naskenovať. Uistite sa, že sú viditeľné štyri rohy dokumentu a jeho obsah. Skopírujte obrázok do rovnakého priečinka, do ktorého ukladáte programové súbory.
Odovzdajte cestu vstupného obrázka do OpenCV. Vytvorte kópiu pôvodného obrázka, ako ju budete potrebovať pri transformácii perspektívy. Vydeľte výšku pôvodného obrázka výškou, na ktorú chcete zmeniť jeho veľkosť. Tým sa zachová pomer strán. Nakoniec vytlačte obrázok so zmenenou veľkosťou.
# Prechádzanie cestou obrazu
original_img = cv2.imread('sample.jpg')
copy = original_img.copy()# Zmenená výška v stovkách
pomer = original_img.shape[0] / 500.0
img_resize = imutils.resize (original_img, height=500)# Zobrazenie výstupu
cv2.imshow(Obrázok so zmenenou veľkosťou, veľkosť_img)
# Čaká sa, kým používateľ stlačí ľubovoľné tlačidlo
cv2.waitKey(0)
Výstup vyššie uvedeného kódu je nasledujúci:
Teraz ste zmenili veľkosť pôvodného obrázka na 500 pixelov.
Konverzia obrázka so zmenenou veľkosťou na odtiene sivej
Skonvertujte RGB obrázok so zmenenou veľkosťou na odtiene sivej. Väčšina knižníc na spracovanie obrázkov pracuje iba s obrázkami v odtieňoch sivej, pretože sa ľahšie spracúvajú.
sivý_obrázok = cv2.cvtColor (veľkosť_obr., cv2.COLOR_BGR2GRAY)
cv2.imshow(„Sivý obrázok“, sivý_obrázok)
cv2.waitKey(0)
Všimnite si rozdiel medzi pôvodným obrázkom a sivým obrázkom.
Farebná tabuľka sa zmenila na čiernobielu.
Použitie detektora hrán
Na sivý obrázok použite filter Gaussovho rozostrenia, aby ste odstránili šum. Potom zavolajte šikovnú funkciu OpenCV na detekciu hrán prítomných na obrázku.
blurred_image = cv2.GaussianBlur (gray_image, (5, 5), 0)
edged_img = cv2.Canny (rozmazaný_obrázok, 75, 200)
cv2.imshow("Okraje obrázka", edged_img)
cv2.waitKey(0)
Na výstupe sú viditeľné okraje.
Okraje, s ktorými budete pracovať, sú okraje dokumentu.
Nájdenie najväčšieho obrysu
Rozpoznajte obrysy prítomné na obrázku s okrajmi. Zoraďte ich v zostupnom poradí a ponechajte iba päť najväčších obrysov. Aproximujte najväčší obrys so štyrmi stranami tak, že prejdete cez zoradené obrysy.
cnts, _ = cv2.findContours (edged_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = zoradené (cnts, key=cv2.contourArea, reverse=Pravda)[:5]pre c v cnts:
peri = cv2.arcLength (c, Pravda)
cca = cv2.approxPolyDP(c, 0.02 * peri, Pravda)
ak len (približne) == 4:
doc = cca
prestávka
Kontúra so štyrmi stranami bude pravdepodobne obsahovať dokument.
Krúženie štyroch rohov obrysu dokumentu
Zakrúžkujte rohy rozpoznaného obrysu dokumentu. Pomôže vám to určiť, či váš program dokázal rozpoznať dokument na obrázku.
p = []
pre d v doc:
tuple_point = tuple (d[0])
cv2.circle (img_resize, tuple_point, 3, (0, 0, 255), 4)
p.append (tuple_point)
cv2.imshow(„Zakrúžkované rohové body“, veľkosť_img)
cv2.waitKey(0)
Implementujte krúženie na obrázku RGB so zmenenou veľkosťou.
Po zistení dokumentu ho teraz musíte extrahovať z obrázka.
Použitie deformačnej perspektívy na získanie požadovaného obrazu
Warp perspektíva je technika počítačového videnia na transformáciu obrazu na korekciu skreslenia. Transformuje obraz do inej roviny, čo vám umožňuje pozerať sa na obraz z iného uhla.
warped_image = perspective_transform (copy, doc.reshape(4, 2) * pomer)
warped_image = cv2.cvtColor (skrivený_obrázok, cv2.COLOR_BGR2GRAY)
cv2.imshow("Deformovaný obrázok", imutils.resize (warped_image, height=650))
cv2.waitKey(0)
Ak chcete získať zdeformovaný obrázok, musíte to urobiť vytvorte jednoduchý modul ktorý vykoná transformáciu perspektívy.
Transformačný modul
Modul zoradí body rohov dokumentu. Tiež transformuje obraz dokumentu do inej roviny a zmení uhol kamery na záber zhora.
Otvorte súbor transform.py, ktorý ste vytvorili predtým. Importujte knižnice OpenCV a NumPy.
importovať numpy ako np
importovať cv2
Tento modul bude obsahovať dve funkcie. Vytvorte funkciu, ktorá zoradí súradnice rohových bodov dokumentu. Prvá súradnica bude súradnica ľavého horného rohu, druhá súradnica pravého horného rohu, tretia bude v pravom dolnom rohu a štvrtá súradnica bude v ľavom dolnom rohu rohu.
defobjednávky_body(bodov):
# inicializácia zoznamu súradníc, ktoré sa majú objednať
rect = np.zeros((4, 2), dtype = "float32")s = súčet bodov (os = 1)
# ľavý horný bod bude mať najmenší súčet
rect[0] = body[np.argmin (s)]# bod vpravo dole bude mať najvyšší súčet
rect[2] = body[np.argmax (s)]výpočet rozdielu medzi bodmi,
pravý horný bod bude mať najmenší rozdiel,
zatiaľ čo ľavý spodok bude mať najväčší rozdiel
diff = np.diff (body, os = 1)
rect[1] = body[np.argmin (rozdiel)]
rect[3] = body[np.argmax (rozdiel)]
# vráti objednané súradnice
vrátiť rect
Vytvorte druhú funkciu, ktorá vypočíta rohové súradnice nového obrázka a získa záber zhora. Potom vypočíta maticu transformácie perspektívy a vráti zdeformovaný obrázok.
defperspektíva_premena(obrázok, body):
# objednané súradnice rozbaľte jednotlivo
rect = order_body (body)
(tl, tr, br, bl) = rectvypočítajte šírku nového obrázka, ktorý bude
maximálna vzdialenosť medzi vpravo dole a dole vľavo
x-ové súradnice alebo vpravo hore a x-ové súradnice vľavo hore
šírkaA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
šírkaB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max (int (šírka A), int (šírka B))vypočítajte výšku nového obrázka, ktorý bude
maximálna vzdialenosť medzi ľavým horným okrajom a y-ové súradnice vľavo dole
výškaA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
výškaB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maxHeight = max (int (výškaA), int (výškaB))zostavte množinu cieľových bodov na získanie záberu nad hlavou
dst = np.array([
[0, 0],
[maxWidth - 1, 0],
[maxWidth - 1, maxHeight - 1],
[0, maxHeight - 1]], dtype = "float32")# vypočítajte maticu transformácie perspektívy
transform_matrix = cv2.getPerspectiveTransform (rect, dst)# Použite transformačnú maticu
deformovaný = cv2.warpPerspective (image, transform_matrix, (maxWidth, maxHeight))
# vrátiť zdeformovaný obrázok
vrátiť pokrivený
Teraz ste vytvorili transformačný modul. Chyba pri importe perspective_transform teraz zmizne.
Všimnite si, že zobrazený obrázok má záber nad hlavou.
Použitie adaptívneho prahu a uloženie naskenovaného výstupu
V súbore main.py použite Gaussov prah na zdeformovaný obrázok. Takto získa pokrivený obrázok naskenovaný vzhľad. Uložte výstup naskenovaného obrázka do priečinka obsahujúceho programové súbory.
T = prahový_miestny (skrútený_obrázok, 11, offset=10, metóda="gaussovský")
skrútený = (skrútený_obrázok > T).astype("uint8") * 255
cv2.imwrite('./'+'skenovať'+'.png',skrútené)
Uložením skenu vo formáte PNG sa zachová kvalita dokumentu.
Zobrazenie výstupu
Vytlačte obrázok naskenovaného dokumentu:
cv2.imshow("Konečný naskenovaný obrázok", imutils.resize (skrútené, výška=650))
cv2.waitKey(0)
cv2.destroyAllWindows()
Nasledujúci obrázok zobrazuje výstup programu, režijný záber naskenovaného dokumentu.
Ako pokročiť v počítačovom videní
Vytvorenie skenera dokumentov pokrýva niektoré kľúčové oblasti počítačového videnia, čo je široká a zložitá oblasť. Ak chcete napredovať v počítačovom videní, mali by ste pracovať na zaujímavých, ale náročných projektoch.
Mali by ste si tiež prečítať viac o tom, ako môžete využívať počítačové videnie so súčasnými technológiami. Budete tak informovaní a získate nové nápady na projekty, na ktorých môžete pracovať.