Čtenáři jako vy pomáhají podporovat MUO. Když provedete nákup pomocí odkazů na našich stránkách, můžeme získat provizi přidružené společnosti. Přečtěte si více.

Možná budete chtít dokument digitalizovat, abyste ušetřili fyzický prostor, nebo vytvořit zálohu. Ať tak či onak, napsat program, který dokáže převést fotografie vašich papírových souborů do standardního formátu, je úkol, ve kterém Python vyniká.

Pomocí kombinace vhodných knihoven můžete vytvořit malou aplikaci pro digitalizaci dokumentů. Váš program vezme obraz fyzického dokumentu jako vstup, použije na něj několik technik zpracování obrazu a vydá naskenovanou verzi vstupu.

Příprava vašeho prostředí

Abyste mohli postupovat podle tohoto článku, měli byste být obeznámeni s základy Pythonu. Musíte mít také pochopení jak pracovat s knihovnou NumPy Python.

Otevřete libovolné IDE Pythonu a vytvořte dva soubory Pythonu. Jednu pojmenujte main.py a druhou transform.py. Poté spusťte na terminálu následující příkaz a nainstalujte požadované knihovny.

instagram viewer
pip install OpenCV-Python imutils scikit-image NumPy

Budete používat OpenCV-Python, abyste získali obrazový vstup a provedli nějaké zpracování obrazu. Imutils pro změnu velikosti vstupních a výstupních obrázků. scikit-image, chcete-li na obrázek použít práh. NumPy vám pomůže pracovat s poli.

Počkejte, až se instalace dokončí a IDE aktualizuje kostry projektu. Po dokončení aktualizace koster jste připraveni začít kódovat. Úplný zdrojový kód je k dispozici v a úložiště GitHub.

Import nainstalovaných knihoven

Otevřete soubor main.py a importujte knihovny, které jste nainstalovali do prostředí. To vám umožní volat a používat jejich funkce v případě potřeby.

import cv2
import imutils
z skimage.filtry import prahová_místní
z přeměnit import perspektiva_transformovat

Ignorujte chybu vyvolanou na perspective_transform. Jakmile dokončíte práci na souboru transform.py, zmizí.

Převzetí a změna velikosti vstupu

Pořiďte jasný obrázek dokumentu, který chcete naskenovat. Ujistěte se, že jsou viditelné čtyři rohy dokumentu a jeho obsah. Zkopírujte obrázek do stejné složky, do které ukládáte soubory programu.

Předejte cestu vstupního obrázku do OpenCV. Vytvořte kopii původního obrázku, jak ji budete potřebovat při transformaci perspektivy. Vydělte výšku původního obrázku výškou, na kterou chcete změnit jeho velikost. Tím zachováte poměr stran. Nakonec vytiskněte obrázek se změněnou velikostí.

# Předání cesty obrazu
original_img = cv2.imread('sample.jpg')
kopie = original_img.copy()

# Změněná výška ve stovkách
poměr = original_img.shape[0] / 500.0
img_resize = imutils.resize (original_img, height=500)

# Zobrazení výstupu
cv2.imshow('Změněná velikost obrázku', velikost_img)

# Čekání, až uživatel stiskne libovolnou klávesu
cv2.waitKey(0)

Výstup výše uvedeného kódu je následující:

Nyní jste změnili velikost původního obrázku na 500 pixelů.

Převod obrázku se změněnou velikostí na stupně šedi

Převeďte obrázek RGB se změněnou velikostí na stupně šedi. Většina knihoven pro zpracování obrázků pracuje pouze s obrázky ve stupních šedi, protože se snáze zpracovávají.

gray_image = cv2.cvtColor (img_resize, cv2.COLOR_BGR2GRAY)
cv2.imshow("Šedý obrázek", šedý_obrázek)
cv2.waitKey(0)

Všimněte si rozdílu mezi původním a šedým obrázkem.

Barevný stůl se změnil na černobílý.

Použití detektoru hran

Použijte filtr Gaussova rozostření na zašedlý obrázek, abyste odstranili šum. Poté zavolejte šikovnou funkci OpenCV pro detekci hran přítomných na obrázku.

blurred_image = cv2.GaussianBlur (gray_image, (5, 5), 0)
edged_img = cv2.Canny (rozmazaný_obrázek, 75, 200)
cv2.imshow("Okraje obrázku", edged_img)
cv2.waitKey(0)

Na výstupu jsou vidět okraje.

Okraje, se kterými budete pracovat, jsou okraje dokumentu.

Nalezení největšího obrysu

Zjistěte kontury přítomné na obrázku s okraji. Seřaďte je v sestupném pořadí a zachovejte pouze pět největších vrstevnic. Aproximujte největší obrys se čtyřmi stranami procházením setříděných obrysů.

cnts, _ = cv2.findContours (edged_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = seřazeno (cnts, klíč=cv2.contourArea, reverse=Skutečný)[:5]

pro C v cnts:
peri = cv2.arcLength (c, Skutečný)
cca = cv2.approxPolyDP(c, 0.02 * peri, Skutečný)

-li len (cca) == 4:
doc = cca
přestávka

Kontura se čtyřmi stranami bude pravděpodobně obsahovat dokument.

Kroužení čtyř rohů obrysu dokumentu

Zakroužkujte rohy zjištěného obrysu dokumentu. To vám pomůže určit, zda byl váš program schopen detekovat dokument v obrázku.

p = []

pro 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("Zakroužkované rohové body", velikost_img)
cv2.waitKey(0)

Implementujte kroužení na obrázku RGB se změněnou velikostí.

Po zjištění dokumentu je nyní třeba jej extrahovat z obrázku.

Použití Warp Perspective k získání požadovaného obrázku

Warp perspektiva je technika počítačového vidění pro transformaci obrazu za účelem opravy zkreslení. Transformuje obraz do jiné roviny, což vám umožní sledovat obraz z jiného úhlu.

warped_image = perspective_transform (copy, doc.reshape(4, 2) * poměr)
warped_image = cv2.cvtColor (pokřivený_image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Pokřivený obrázek", imutils.resize (warped_image, height=650))
cv2.waitKey(0)

Chcete-li získat pokřivený obrázek, musíte vytvořit jednoduchý modul který provede transformaci perspektivy.

Transformační modul

Modul seřadí body rohů dokumentu. Také převede obraz dokumentu do jiné roviny a změní úhel kamery na záběr shora.

Otevřete soubor transform.py, který jste vytvořili dříve. Importujte knihovny OpenCV a NumPy.

import nemotorný tak jako np
import cv2

Tento modul bude obsahovat dvě funkce. Vytvořte funkci, která seřadí souřadnice rohových bodů dokumentu. První souřadnice bude souřadnice levého horního rohu, druhá bude souřadnice pravého horního rohu, třetí bude v pravém dolním rohu a čtvrtá souřadnice bude v levém dolním rohu roh.

defobjednávkové_body(bodů):
# inicializace seznamu souřadnic k objednání
rect = np.zeros((4, 2), dtype = "float32")

s = součet bodů (osa = 1)

# levý horní bod bude mít nejmenší součet
obdélník [0] = body[np.argmin (s)]

# bod vpravo dole bude mít největší součet
obdélník [2] = body[np.argmax (s)]

výpočet rozdílu mezi body,
pravý horní bod bude mít nejmenší rozdíl,
zatímco vlevo dole bude největší rozdíl
diff = np.diff (body, osa = 1)
obdélník [1] = body[np.argmin (rozdíl)]
obdélník [3] = body[np.argmax (rozdíl)]

# vrátí objednané souřadnice
vrátit se rect

Vytvořte druhou funkci, která vypočítá rohové souřadnice nového obrázku a získá záběr shora. Poté vypočítá matici perspektivní transformace a vrátí zdeformovaný obraz.

defperspektiva_transformovat(obrázek, body):
# rozbalte objednané souřadnice jednotlivě
rect = order_body (body)
(tl, tr, br, bl) = rect

vypočítejte šířku nového obrázku, který bude
maximální vzdálenost mezi vpravo dole a vlevo dole
x-ové souřadnice nebo vpravo nahoře a x-ové souřadnice vlevo nahoře
šířkaA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
šířkaB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max (int (widthA), int (widthB))

vypočítat výšku nového obrázku, který bude
maximální vzdálenost mezi levým horním okrajem a y-ové souřadnice vlevo 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))

sestrojte sadu cílových bodů, abyste získali záběr nad hlavou
dst = np.array([
[0, 0],
[maxWidth - 1, 0],
[maxWidth - 1, Maximální výška - 1],
[0, Maximální výška - 1]], dtype = "float32")

# vypočítat matici transformace perspektivy
transform_matrix = cv2.getPerspectiveTransform (rect, dst)

# Aplikujte transformační matici
warped = cv2.warpPerspective (image, transform_matrix, (maxWidth, maxHeight))

# vrátit pokřivený obrázek
vrátit se pokřivený

Nyní jste vytvořili transformační modul. Chyba při importu perspective_transform nyní zmizí.

Všimněte si, že zobrazený obrázek má záběr nad hlavou.

Použití adaptivního prahu a uložení naskenovaného výstupu

V souboru main.py použijte Gaussův práh na pokřivený obraz. Pokřivený obrázek tak získá naskenovaný vzhled. Uložte výstup naskenovaného obrázku do složky obsahující soubory programu.

T = prahová_místní (pokřivený_obrázek, 11, offset=10, metoda="gaussovský")
warped = (warped_image > T).astype("uint8") * 255
cv2.imwrite('./'+'skenovat'+'.png',pokřivené)

Uložením skenu ve formátu PNG se zachová kvalita dokumentu.

Zobrazení výstupu

Výstup obrázku naskenovaného dokumentu:

cv2.imshow("Konečný naskenovaný obrázek", imutils.resize (pokřivený, výška=650))
cv2.waitKey(0)
cv2.destroyAllWindows()

Následující obrázek ukazuje výstup programu, režijní snímek naskenovaného dokumentu.

Jak pokročit v počítačovém vidění

Vytvoření skeneru dokumentů pokrývá některé základní oblasti počítačového vidění, což je široká a komplexní oblast. Pro pokrok v počítačovém vidění byste měli pracovat na zajímavých, ale náročných projektech.

Měli byste si také přečíst více o tom, jak můžete používat počítačové vidění se současnými technologiemi. Budete tak informováni a získáte nové nápady na projekty, na kterých můžete pracovat.