É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.
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) = egyenesszá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.