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) = rektarvutab 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.