Teiesugused lugejad aitavad MUO-d toetada. Kui teete ostu meie saidil olevate linkide abil, võime teenida sidusettevõtte komisjonitasu. Loe rohkem.

Võib-olla soovite füüsilise ruumi säästmiseks dokumendi digiteerida või luua salvestusvarukoopia. Mõlemal juhul on Pythonil suurepärane ülesanne, et kirjutada programm, mis suudab teie paberfailide fotod standardvormingusse teisendada.

Kasutades sobivate teekide kombinatsiooni, saate dokumentide digiteerimiseks luua väikese rakenduse. Teie programm võtab sisendiks pildi füüsilisest dokumendist, rakendab sellele mitmeid pilditöötlustehnikaid ja väljastab sisendi skannitud versiooni.

Teie keskkonna ettevalmistamine

Selle artikli jälgimiseks peaksite olema tuttav Pythoni põhitõed. Samuti peab teil olema arusaamine kuidas töötada NumPy Pythoni raamatukoguga.

Avage mis tahes Pythoni IDE ja looge kaks Pythoni faili. Nimetage üks main.py ja teine ​​transform.py. Seejärel käivitage vajalike teekide installimiseks terminalis järgmine käsk.

pip install OpenCV-Python imutils scikit-image NumPy

Pildisisendi tegemiseks ja pilditöötluseks kasutate OpenCV-Pythonit. Imutils sisend- ja väljundpiltide suuruse muutmiseks. scikit-image, et rakendada pildile läve. NumPy aitab teil massiividega töötada.

Oodake, kuni installimine lõpeb ja IDE värskendab projekti skelette. Kui skelettide värskendamine on lõppenud, olete valmis kodeerimist alustama. Täielik lähtekood on saadaval a GitHubi hoidla.

Installitud teekide importimine

Avage fail main.py ja importige keskkonda installitud teegid. See võimaldab teil vajadusel helistada ja nende funktsioone kasutada.

importida cv2
importida imutils
alates skimage.filtrid importida lävi_kohalik
alates teisendada importida perspektiiv_teisendus

Ignoreeri perspektiivi_teisendusviga. See kaob, kui olete faili transform.py kallal töötamise lõpetanud.

Sisendi võtmine ja suuruse muutmine

Tehke skannitavast dokumendist selge pilt. Veenduge, et dokumendi neli nurka ja selle sisu oleksid nähtavad. Kopeerige pilt samasse kausta, kuhu salvestate programmifailid.

Edastage sisendpildi tee OpenCV-sse. Tehke originaalpildist koopia, kuna seda perspektiivi teisendamise ajal vajate. Jagage algse pildi kõrgus kõrgusega, milleni soovite selle suurust muuta. See säilitab kuvasuhte. Lõpuks väljastage muudetud suurusega pilt.

# Kujutise tee läbimine
original_img = cv2.imread('sample.jpg')
koopia = original_img.copy()

# Muudetud kõrgus sadades
suhe = originaal_kujutis.kuju[0] / 500.0
img_resize = imutils.resize (original_img, height=500)

# Kuvab väljundit
cv2.imshow("Muudetud pildi suurust", img_resize)

# Ootab, kuni kasutaja vajutab mis tahes klahvi
cv2.waitKey(0)

Ülaltoodud koodi väljund on järgmine:

Olete nüüd muutnud algse pildi kõrguse 500 pikslile.

Muudetud suurusega pildi teisendamine halltooniks

Teisendage muudetud suurusega RGB-pilt halltooniks. Enamik pilditöötlusteeke töötab ainult halltoonides piltidega, kuna neid on lihtsam töödelda.

gray_image = cv2.cvtColor (img_resize, cv2.COLOR_BGR2GRAY)
cv2.imshow("Hallitud pilt", hall_pilt)
cv2.waitKey(0)

Pange tähele erinevust algse pildi ja halli pildi vahel.

Värviline laud on muutunud must-valgeks.

Servadetektori rakendamine

Müra eemaldamiseks rakendage halliks pildile Gaussi hägufiltrit. Seejärel helistage pildil olevate servade tuvastamiseks funktsioonile OpenCV canny.

hägune_pilt = cv2.GaussianBlur (hall_pilt, (5, 5), 0)
edged_img = cv2.Canny (hägune_pilt, 75, 200)
cv2.imshow("Pildi servad", servad_img)
cv2.waitKey(0)

Väljundil on näha servad.

Servad, millega töötate, on dokumendi servad.

Suurima kontuuri leidmine

Tuvastage servaga pildil olevad kontuurid. Sorteerige need kahanevas järjekorras, säilitades ainult viis suurimat kontuuri. Ligikaudu suurim nelja küljega kontuur, kerides läbi sorteeritud kontuuride.

cnts, _ = cv2.findContours (edged_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = sorteeritud (cnts, võti=cv2.contourArea, reverse=Tõsi)[:5]

jaoks c sisse cnts:
peri = cv2.arcLength (c, Tõsi)
umbkaudu = cv2.approxPolyDP(c, 0.02 * peri, Tõsi)

kui len (umbes) == 4:
doc = u
murda

Nelja küljega kontuur sisaldab tõenäoliselt dokumenti.

Dokumendi kontuuri nelja nurga ümber ringutamine

Ringi tuvastatud dokumendikontuuri nurgad. See aitab teil kindlaks teha, kas teie programm suutis pildil oleva dokumendi tuvastada.

p = []

jaoks d sisse doc:
korteeži_punkt = korteež (d[0])
cv2.circle (img_resize, korteeži_punkt, 3, (0, 0, 255), 4)
p.append (korpuse_punkt)

cv2.imshow("Ringiga ümbritsetud nurgapunktid", img_resize)
cv2.waitKey(0)

Rakendage muudetud suurusega RGB-pildil ringjoont.

Pärast dokumendi tuvastamist peate nüüd dokumendi pildist eraldama.

Warp Perspective kasutamine soovitud pildi saamiseks

Väändeperspektiiv on arvutinägemise tehnika kujutise teisendamiseks moonutuste parandamiseks. See muudab pildi erinevaks tasapinnaks, võimaldades teil pilti vaadata erineva nurga alt.

warped_image = perspektiivi_teisendus (copy, doc.reshape(4, 2) * suhe)
warped_image = cv2.cvtColor (väänatud_pilt, cv2.COLOR_BGR2GRAY)
cv2.imshow("Väärdunud pilt", imutils.resize (kõverdatud_pilt, kõrgus=650))
cv2.waitKey(0)

Väändunud pildi saamiseks peate luua lihtne moodul mis viib läbi perspektiivi teisenduse.

Transformatsiooni moodul

Moodul järjestab dokumendinurkade punktid. Samuti muudab see dokumendi kujutise teisele tasapinnale ja muudab kaamera nurga pealisvõtteks.

Avage varem loodud fail transform.py. Importige OpenCV ja NumPy teegid.

importida tuim nagu np
importida cv2

See moodul sisaldab kahte funktsiooni. Looge funktsioon, mis järjestab dokumendi nurgapunktide koordinaadid. Esimene koordinaat on vasaku ülanurga koordinaat, teine ​​​​parema ülanurga koordinaat, kolmas koordinaat on alumises paremas nurgas ja neljas koordinaat vasakpoolses allnurgas nurk.

deforder_points(punktid):
# tellitavate koordinaatide loendi lähtestamine
rect = np.zeros((4, 2), dtype = "float32")

s = pts.sum (telg = 1)

# vasakpoolses ülanurgas on väikseim summa
rekt[0] = pts[np.argmin (s)]

# alumises paremas punktis on suurim summa
rekt[2] = pts[np.argmax (s)]

punktide vahe arvutamine,
ülemises paremas punktis on väikseim erinevus,
samas kui vasakpoolses allosas on suurim erinevus
diff = np.diff (punktid, telg = 1)
rekt[1] = pts[np.argmin (diff)]
rekt[3] = pts[np.argmax (diff)]

# tagastab tellitud koordinaadid
tagasi rekt

Looge teine ​​funktsioon, mis arvutab uue pildi nurgakoordinaadid ja loob pealisvõtte. Seejärel arvutab see perspektiivi teisendusmaatriksi ja tagastab kõverdatud kujutise.

defperspektiiv_teisendus(pilt, punktid):
# pakkige tellitud koordinaadid ükshaaval lahti
rect = order_points (punktid)
(tl, tr, br, bl) = rekt

arvutab uue pildi laiuse, mis on
maksimaalne kaugus all paremal ja all vasakul
x-koordinaadid või üleval paremal ja ülevalt vasakult x-koordinaadid
laiusA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
laiusB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max (int (widthA), int (widthB))

arvutage uue pildi kõrgus, mis on
maksimaalne kaugus vasakpoolse ülanurga vahel ja alumises vasakpoolses y-koordinaadid
kõrgusA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
kõrgusB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maxHeight = max (int (heightA), int (heightB))

konstrueerida sihtpunktide kogum, et saada üldpilt
dst = np.array([
[0, 0],
[maxWidth - 1, 0],
[maxWidth - 1, max Kõrgus - 1],
[0, max Kõrgus - 1]], dtype = "float32")

# arvutab perspektiivi teisendusmaatriksi
transform_matrix = cv2.getPerspectiveTransform (rekt, dst)

# Rakendage teisendusmaatriksit
väändunud = cv2.warpPerspective (pilt, teisendusmaatriks, (maxWidth, maxHeight))

# tagastab kõverdatud pildi
tagasi väänatud

Olete nüüd loonud teisendusmooduli. Perspektiivi_transformi importimise viga kaob nüüd.

Pange tähele, et kuvataval pildil on pealisvõte.

Kohanduva läve rakendamine ja skannitud väljundi salvestamine

Rakendage failis main.py kõverdatud pildile Gaussi lävi. See annab kõverdatud pildile skannitud välimuse. Salvestage skannitud kujutise väljund programmifaile sisaldavasse kausta.

T = lävi_kohalik (väänatud_pilt, 11, nihe=10, meetod="gaussi")
warped = (kõverdatud_pilt > T).astype("uint8") * 255
cv2.imwrite('./'+'skanni'+".png",väänatud)

Skannimise PNG-vormingus salvestamine säilitab dokumendi kvaliteedi.

Väljundi kuvamine

Skannitud dokumendi kujutise väljastamine:

cv2.imshow("Lõplik skannitud pilt", imutils.resize (väänatud, kõrgus=650))
cv2.waitKey(0)
cv2.destroyAllWindows()

Järgmine pilt näitab programmi väljundit, skannitud dokumendi üldpilti.

Kuidas arvutinägemises edasi liikuda

Dokumendiskanneri loomine hõlmab mõningaid arvutinägemise põhivaldkondi, mis on lai ja keeruline valdkond. Arvutinägemises arendamiseks peaksite töötama huvitavate, kuid väljakutseid pakkuvate projektidega.

Samuti peaksite lugema rohkem selle kohta, kuidas saate arvutinägemist praeguste tehnoloogiatega kasutada. See hoiab teid kursis ja annab teile uusi ideid projektide jaoks, mille kallal edasi töötada.