Az Önhöz hasonló olvasók támogatják a MUO-t. Amikor a webhelyünkön található linkek használatával vásárol, társult jutalékot kaphatunk. Olvass tovább.

Érdemes lehet digitalizálnia egy dokumentumot, hogy fizikai helyet takarítson meg, vagy biztonsági mentést készítsen. Akárhogy is, egy olyan program megírása, amely képes a papírfájlok fényképeit szabványos formátumba konvertálni, a Python kiváló feladat.

A megfelelő könyvtárak kombinációjával létrehozhat egy kis alkalmazást dokumentumok digitalizálására. A program bemenetként egy fizikai dokumentum képét veszi, számos képfeldolgozási technikát alkalmaz rá, és a bemenet szkennelt változatát adja ki.

A környezet előkészítése

A cikk követéséhez ismernie kell a Python alapjai. Önnek is meg kell értenie hogyan kell dolgozni a NumPy Python könyvtárral.

Nyissa meg bármelyik Python IDE-t, és hozzon létre két Python-fájlt. Nevezze el az egyiket main.py, a másikat pedig transform.py. Ezután futtassa a következő parancsot a terminálon a szükséges könyvtárak telepítéséhez.

instagram viewer
pip telepítése OpenCV-Python imutils scikit-image NumPy

Az OpenCV-Python-t használja a képbevitelhez és a képfeldolgozáshoz. Imutils a bemeneti és kimeneti képek átméretezéséhez. scikit-image, hogy küszöbértéket alkalmazzon a képen. A NumPy segít a tömbök kezelésében.

Várja meg, amíg a telepítés befejeződik, és az IDE frissíti a projektvázakat. Miután a csontvázak frissítése befejeződött, készen áll a kódolás megkezdésére. A teljes forráskód elérhető a GitHub adattár.

A telepített könyvtárak importálása

Nyissa meg a main.py fájlt, és importálja a környezetbe telepített könyvtárakat. Ez lehetővé teszi, hogy szükség esetén hívja és használja a funkcióikat.

import cv2
import imutilok
tól től skimage.filters import threshold_local
tól től átalakítani import perspektíva_transzformáció

Hagyja figyelmen kívül a perspektivikus_transzformációnál megjelenő hibát. Ez eltűnik, ha befejezi a transform.py fájlon való munkát.

A bemenet felvétele és átméretezése

Készítsen tiszta képet a beolvasni kívánt dokumentumról. Győződjön meg arról, hogy a dokumentum négy sarka és annak tartalma látható. Másolja a képet ugyanabba a mappába, ahol a programfájlokat tárolja.

Adja át a bemeneti kép elérési útját az OpenCV-nek. Készítsen másolatot az eredeti képről, mivel szüksége lesz rá a perspektíva-átalakítás során. Ossza el az eredeti kép magasságát azzal a magassággal, amelyre át szeretné méretezni. Ez megőrzi a képarányt. Végül adja ki az átméretezett képet.

# Áthaladva a kép útvonalán
original_img = cv2.imread("minta.jpg")
másolat = eredeti_img.copy()

# Az átméretezett magasság százban
arány = eredeti_kép.alak[0] / 500.0
img_resize = imutils.resize (eredeti_img, magasság=500)

# Kimenet megjelenítése
cv2.imshow("Átméretezett kép", img_resize)

# Várakozás, hogy a felhasználó megnyomjon egy gombot
cv2.waitKey(0)

A fenti kód kimenete a következő:

Az eredeti kép magasságát most 500 képpontra méretezte át.

Az átméretezett kép átalakítása szürkeárnyalatossá

Alakítsa át az átméretezett RGB képet szürkeárnyalatossá. A legtöbb képfeldolgozó könyvtár csak szürkeárnyalatos képekkel működik, mivel azok könnyebben feldolgozhatók.

gray_image = cv2.cvtColor (img_resize, cv2.COLOR_BGR2GRAY)
cv2.imshow("Szürke kép", szürke_kép)
cv2.waitKey(0)

Figyelje meg a különbséget az eredeti és a szürke kép között.

A színes asztal fekete-fehér lett.

Élérzékelő alkalmazása

A zaj eltávolításához alkalmazzon Gauss-elmosódásszűrőt a szürke képre. Ezután hívja meg az OpenCV canny függvényt a kép éleinek észleléséhez.

blurred_image = cv2.GaussianBlur (szürke_kép, (5, 5), 0)
edged_img = cv2.Canny (elmosódott_kép, 75, 200)
cv2.imshow("Kép szélei", edged_img)
cv2.waitKey(0)

A szélek láthatóak a kimeneten.

Azok a szélek, amelyekkel dolgozni fog, megegyeznek a dokumentum éleivel.

A legnagyobb kontúr megtalálása

Érzékelje a szélezett képen lévő kontúrokat. Rendezze őket csökkenő sorrendbe úgy, hogy csak az öt legnagyobb kontúrt tartsa meg. Közelítse meg a legnagyobb kontúrt négy oldallal a rendezett kontúrok áthurkolásával.

cnts, _ = cv2.findContours (edged_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = rendezve (cnts, kulcs=cv2.contourArea, fordított=Igaz)[:5]

számára c ban ben cnts:
peri = cv2.arcLength (c, Igaz)
kb = cv2.approxPolyDP(c, 0.02 *peri, Igaz)

ha len (kb) == 4:
doc = kb
szünet

A négy oldalas kontúr valószínűleg tartalmazza a dokumentumot.

A dokumentumkontúr négy sarkának körbezárása

Karikázza be az észlelt dokumentumkontúr sarkait. Ez segít meghatározni, hogy a program képes volt-e észlelni a dokumentumot a képen.

p = []

számára d ban ben doki:
tuple_point = sor (d[0])
cv2.circle (img_resize, tuple_point, 3, (0, 0, 255), 4)
p.append (tuple_point)

cv2.imshow("Bekarikázott sarokpontok", img_resize)
cv2.waitKey(0)

Végezze el a körözést az átméretezett RGB-képen.

A dokumentum észlelése után ki kell bontania a dokumentumot a képből.

A Warp Perspective használata a kívánt kép eléréséhez

A vetemedés perspektívája egy számítógépes látástechnika a kép átalakítására a torzítások kijavítása érdekében. Átalakítja a képet egy másik síkra, lehetővé téve a kép más szögből való megtekintését.

warped_image = perspektíva_transzformáció (másolás, doc.reshape(4, 2) * arány)
warped_image = cv2.cvtColor (elvetemült_kép, cv2.COLOR_BGR2GRAY)
cv2.imshow("Elvetemült kép", imutils.resize (elvetemült_kép, magasság=650))
cv2.waitKey(0)

Elvetemült kép eléréséhez szükséges hozzon létre egy egyszerű modult amely végrehajtja a perspektíva-transzformációt.

Transzformációs modul

A modul rendezi a dokumentumsarkok pontjait. Ezenkívül a dokumentum képét egy másik síkra alakítja át, és a kamera szögét felülnézeti felvételre változtatja.

Nyissa meg a korábban létrehozott transform.py fájlt. OpenCV és NumPy könyvtárak importálása.

import zsibbadt mint np
import cv2

Ez a modul két funkciót fog tartalmazni. Hozzon létre egy függvényt, amely rendezi a dokumentum sarokpontjainak koordinátáit. Az első koordináta a bal felső sarok koordinátája lesz, a második a jobb felső sarok koordinátája, a harmadik a jobb alsó sarok, a negyedik koordináta pedig a bal alsóé lesz sarok.

defsorrend_pontok(pont):
# a megrendelendő koordináták listájának inicializálása
rect = np.zeros((4, 2), dtype = "float32")

s = pts.sum (tengely = 1)

# bal felső pontban lesz a legkisebb összeg
egyenes[0] = pts[np.argmin (s)]

# jobb alsó pontban lesz a legnagyobb összeg
egyenes[2] = pts[np.argmax (s)]

a pontok közötti különbség kiszámítása, a
a jobb felső pontban lesz a legkisebb különbség,
míg a bal alsóban lesz a legnagyobb különbség
diff = np.diff (pont, tengely = 1)
egyenes[1] = pts[np.argmin (diff)]
egyenes[3] = pts[np.argmax (diff)]

# a rendezett koordinátákat adja vissza
Visszatérés rect

Hozzon létre egy második függvényt, amely kiszámítja az új kép sarokkoordinátáit, és elkészíti a felülnézeti felvételt. Ezután kiszámítja a perspektivikus transzformációs mátrixot, és visszaadja az elvetemült képet.

defperspektíva_transzformáció(kép, pont):
# egyenként csomagolja ki a megrendelt koordinátákat
rect = order_points (pont)
(tl, tr, br, bl) = egyenes

számítsa ki az új kép szélességét, amely a
maximális távolság a jobb alsó között és bal alsó
x-koordináták vagy a jobb felső és bal felső x-koordináták
szélességA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
szélességB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max (int (widthA), int (widthB))

számítsa ki az új kép magasságát, amely a
maximális távolság a bal felső között és bal alsó y-koordináták
magasságA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
magasságB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maxHeight = max (int (heightA), int (heightB))

megszerkeszteni a célpontok halmazát, hogy felülnézeti képet kapjunk
dst = np.array([
[0, 0],
[maxWidth - 1, 0],
[maxWidth - 1, maximum magasság - 1],
[0, maximum magasság - 1]], dtype = "float32")

# kiszámítja a perspektivikus transzformációs mátrixot
transform_matrix = cv2.getPerspectiveTransform (rect, dst)

# Alkalmazza a transzformációs mátrixot
warped = cv2.warpPerspective (kép, transzformációs_mátrix, (maxWidth, maxHeight))

# visszaadja az elvetemült képet
Visszatérés megvetemedett

Ezzel létrehozta a transzformációs modult. A perspektiiv_transzformáció importálásának hibája most eltűnik.

Figyelje meg, hogy a megjelenített kép felülnézetben van.

Az adaptív küszöb alkalmazása és a beolvasott kimenet mentése

A main.py fájlban alkalmazza a Gauss-küszöböt az elvetemült képre. Ez szkennelt megjelenést kölcsönöz az elvetemült képnek. Mentse el a beolvasott képet a programfájlokat tartalmazó mappába.

T = threshold_local (elvetemült_kép, 11, offset=10, módszer="gaussian")
warped = (elvetemült_kép > T).astype("uint8") * 255
cv2.imwrite('./'+'letapogatás'+".png",megvetemedett)

A beolvasás PNG formátumban történő mentése megőrzi a dokumentum minőségét.

A kimenet megjelenítése

A beolvasott dokumentum képének kiadása:

cv2.imshow("Végső beszkennelt kép", imutils.resize (vetemült, magasság=650))
cv2.waitKey(0)
cv2.destroyAllWindows()

A következő képen a program kimenete látható, a beolvasott dokumentum felülnézete.

Hogyan lépjünk előre a számítógépes látásban

A dokumentumszkenner létrehozása lefedi a számítógépes látás néhány alapvető területét, amely széles és összetett terület. A számítógépes látás fejlesztéséhez érdekes, de kihívást jelentő projekteken kell dolgoznia.

Olvasson többet arról is, hogyan használhatja a számítógépes látást a jelenlegi technológiákkal. Ez folyamatosan tájékoztatja Önt, és új ötleteket ad a projektekhez.