Galbūt norėsite suskaitmeninti dokumentą, kad sutaupytumėte fizinės vietos, arba sukurti atsarginę kopiją. Bet kuriuo atveju programos, kuri gali konvertuoti jūsų popierinių failų nuotraukas į standartinį formatą, rašymas yra užduotis, kurią „Python“ atlieka puikiai.
Naudodami atitinkamų bibliotekų derinį galite sukurti nedidelę programėlę dokumentams skaitmeninti. Jūsų programa kaip įvestį paims fizinio dokumento vaizdą, pritaikys jam keletą vaizdo apdorojimo metodų ir išves nuskaitytą įvesties versiją.
Aplinkos paruošimas
Norėdami sekti šį straipsnį, turėtumėte susipažinti su Python pagrindai. Jūs taip pat turite suprasti kaip dirbti su NumPy Python biblioteka.
Atidarykite bet kurį Python IDE ir sukurkite du Python failus. Pavadinkite vieną main.py, o kitą transform.py. Tada terminale paleiskite šią komandą, kad įdiegtumėte reikiamas bibliotekas.
pip įdiegti OpenCV-Python imutils scikit-image NumPy
Norėdami įvesti vaizdą ir apdoroti vaizdą, naudosite OpenCV-Python. Imutils, kad pakeistų įvesties ir išvesties vaizdų dydį. scikit-image, kad pritaikytumėte vaizdui slenkstį. NumPy padės dirbti su masyvais.
Palaukite, kol diegimas bus baigtas ir IDE atnaujins projekto skeletus. Kai skeletų atnaujinimas bus baigtas, esate pasirengę pradėti kodavimą. Visą šaltinio kodą rasite a GitHub saugykla.
Įdiegtų bibliotekų importavimas
Atidarykite failą main.py ir importuokite aplinkoje įdiegtas bibliotekas. Tai leis jums paskambinti ir prireikus naudotis jų funkcijomis.
importuoti cv2
importuoti imutils
iš skimage.filtrai importuoti slenkstis_vietinis
iš transformuoti importuoti perspektyvos_transformacija
Nepaisykite klaidos, pateiktos perspective_transform. Jis išnyks, kai baigsite dirbti su transform.py failu.
Įvesties paėmimas ir dydžio keitimas
Padarykite aiškų dokumento, kurį norite nuskaityti, vaizdą. Įsitikinkite, kad matomi keturi dokumento kampai ir jo turinys. Nukopijuokite vaizdą į tą patį aplanką, kuriame saugomi programos failai.
Perduokite įvesties vaizdo kelią į OpenCV. Padarykite originalaus vaizdo kopiją, nes jos jums prireiks keičiant perspektyvą. Padalinkite pradinio vaizdo aukštį iš aukščio, į kurį norite pakeisti jo dydį. Taip bus išlaikytas kraštinių santykis. Galiausiai išveskite pakeisto dydžio vaizdą.
# Pravažiuojamas vaizdo kelias
original_img = cv2.imread('pavyzdys.jpg')
kopija = original_img.copy()# Pakeistas aukštis šimtais
santykis = originalus_img.shape[0] / 500.0
img_resize = imutils.resize (original_img, height=500)# Rodoma išvestis
cv2.imshow(„Pakeisto vaizdo dydžio“, img_resize)
# Laukiama, kol vartotojas paspaus bet kurį klavišą
cv2.waitKey(0)
Aukščiau pateikto kodo išvestis yra tokia:
Dabar pakeitėte pradinio vaizdo aukštį iki 500 pikselių.
Pakeisto dydžio vaizdo konvertavimas į pilkos spalvos toną
Konvertuokite pakeisto dydžio RGB vaizdą į pilkus tonus. Dauguma vaizdo apdorojimo bibliotekų veikia tik su pilkos spalvos vaizdais, nes juos lengviau apdoroti.
gray_image = cv2.cvtColor (img_resize, cv2.COLOR_BGR2GRAY)
cv2.imshow(„Pilkas vaizdas“, pilkas_vaizdas)
cv2.waitKey(0)
Atkreipkite dėmesį į skirtumą tarp pradinio vaizdo ir pilkos spalvos.
Spalvotas stalas tapo juodai baltas.
Krašto detektoriaus taikymas
Norėdami pašalinti triukšmą, pilkam vaizdui pritaikykite Gauso suliejimo filtrą. Tada iškvieskite „OpenCV canny“ funkciją, kad aptiktumėte vaizdo kraštus.
blurred_image = cv2.GaussianBlur (pilkas_vaizdas, (5, 5), 0)
edged_img = cv2.Canny (neryškus_vaizdas, 75, 200)
cv2.imshow("Vaizdo kraštai", edged_img)
cv2.waitKey(0)
Ant išvesties matosi kraštai.
Kraštai, su kuriais dirbsite, yra dokumento kraštai.
Didžiausio kontūro radimas
Aptikti kontūrus, esančius vaizde su kraštais. Rūšiuokite juos mažėjančia tvarka, išlaikydami tik penkis didžiausius kontūrus. Apskaičiuokite didžiausią kontūrą iš keturių pusių, perbraukdami per surūšiuotus kontūrus.
cnts, _ = cv2.findContours (edged_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = surūšiuota (cnts, raktas = cv2.contourArea, atvirkštinis =Tiesa)[:5]dėl c in cnts:
peri = cv2.arcLength (c, Tiesa)
apytikslis = cv2.approxPolyDP(c, 0.02 *peri, Tiesa)
jeigu len (apytiksliai) == 4:
doc = apytiksl
pertrauka
Tikėtina, kad kontūre su keturiomis pusėmis yra dokumentas.
Apsukus keturis dokumento kontūro kampus
Apibrėžkite aptikto dokumento kontūro kampus. Tai padės nustatyti, ar jūsų programa galėjo aptikti dokumentą vaizde.
p = []
dėl d in doc:
tuple_point = eilute (d[0])
cv2.circle (img_resize, tuple_point, 3, (0, 0, 255), 4)
p.pridėti (tuple_point)
cv2.imshow(„Apbraukti kampiniai taškai“, img_resize)
cv2.waitKey(0)
Įdiekite apskritimą ant pakeisto dydžio RGB vaizdo.
Aptikę dokumentą, dabar turite ištraukti dokumentą iš vaizdo.
Norėdami gauti norimą vaizdą, naudokite „Warp Perspective“.
Metmenų perspektyva yra kompiuterinio matymo metodas, skirtas vaizdui paversti taip, kad būtų ištaisyti iškraipymai. Jis paverčia vaizdą į kitą plokštumą, leidžiančią žiūrėti vaizdą kitu kampu.
warped_image = perspektyvos_transformacija (kopijuoti, doc.reshape(4, 2) * santykis)
warped_image = cv2.cvtColor (iškreiptas_vaizdas, cv2.COLOR_BGR2GRAY)
cv2.imshow(„Iškreiptas vaizdas“, imutils.resize (iškrypęs_vaizdas, aukštis=650))
cv2.waitKey(0)
Norėdami gauti iškreiptą vaizdą, turite sukurti paprastą modulį kuri atliks perspektyvos transformaciją.
Transformacijos modulis
Modulis sutvarkys dokumento kampų taškus. Jis taip pat pakeis dokumento vaizdą į kitą plokštumą ir pakeis fotoaparato kampą į kadrą virš galvos.
Atidarykite anksčiau sukurtą transform.py failą. Importuokite OpenCV ir NumPy bibliotekas.
importuoti nelygus kaip np
importuoti cv2
Šiame modulyje bus dvi funkcijos. Sukurkite funkciją, kuri sutvarkys dokumento kampinių taškų koordinates. Pirmoji koordinatė bus viršutinio kairiojo kampo koordinatė, antroji – viršutinio dešiniojo kampo, trečioji bus apatiniame dešiniajame kampe, o ketvirta koordinatė bus apatiniame kairiajame kampe kampas.
deforder_points(tšk.):
# inicijuojamas užsakomų koordinačių sąrašas
rect = np.zeros((4, 2), dtype = "Float32")s = pts.sum (ašis = 1)
# viršutiniame kairiajame taške bus mažiausia suma
tiesa[0] = ts[np.argmin (s)]# taškas apačioje dešinėje turės didžiausią sumą
tiesa[2] = taškai[np.argmax (s)]skaičiuojant skirtumą tarp taškų,
viršutiniame dešiniajame taške bus mažiausias skirtumas,
tuo tarpu apačioje kairėje bus didžiausias skirtumas
skirtumas = np.diff (tšk., ašis = 1)
tiesa[1] = pts[np.argmin (skirtumas)]
tiesa[3] = taškai[np.argmax (skirtumas)]
# grąžina užsakytas koordinates
grąžinti ties
Sukurkite antrą funkciją, kuri apskaičiuos naujo vaizdo kampo koordinates ir gaus kadrą virš galvos. Tada jis apskaičiuos perspektyvinės transformacijos matricą ir grąžins iškreiptą vaizdą.
defperspektyvos_transformacija(vaizdas, taškai):
# atskirai išpakuokite užsakytas koordinates
rect = order_points (ts)
(tl, tr, br, bl) = tiesapskaičiuokite naujo vaizdo plotį, kuris bus
maksimalus atstumas tarp apatinės dešinės ir apačioje kairėje
x-koordinatės arba viršuje dešinėje ir x-koordinatės viršuje, kairėje
plotisA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
plotisB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max (int (widthA), int (widthB))apskaičiuokite naujo vaizdo aukštį, kuris bus
maksimalus atstumas tarp viršutinės kairės pusės ir apačios kairėje y koordinatės
aukštisA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
aukštisB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maxHeight = max (int (aukštisA), int (aukštisB))sudaryti paskirties taškų rinkinį, kad gautumėte viršutinį kadrą
dst = np.masyvas([
[0, 0],
[maxWidth - 1, 0],
[maxWidth - 1, maksimalus ūgis - 1],
[0, maksimalus ūgis - 1]], dtype = "Float32")# apskaičiuokite perspektyvinės transformacijos matricą
transform_matrix = cv2.getPerspectiveTransform (rekt, dst)# Taikykite transformacijos matricą
deformuotas = cv2.warpPerspective (vaizdas, transformacijos_matrica, (maksimalus plotis, maksimalus aukštis))
# grąžinti iškreiptą vaizdą
grąžinti iškreiptas
Dabar sukūrėte transformavimo modulį. Perspektyvos_transform importavimo klaida dabar išnyks.
Atkreipkite dėmesį, kad rodomas vaizdas yra virš galvos.
Adaptyvaus slenksčio taikymas ir nuskaitytos išvesties išsaugojimas
Main.py faile iškreiptam vaizdui taikykite Gauso slenkstį. Tai suteiks iškreiptam vaizdui nuskaitytą išvaizdą. Išsaugokite nuskaityto vaizdo išvestį į aplanką, kuriame yra programos failai.
T = slenkstis_vietinis (iškrypęs_vaizdas, 11, poslinkis=10, metodas ="gausas")
warped = (iškreiptas_vaizdas > T).astype("uint8") * 255
cv2.imwrite('./'+"nuskaityti"+„.png“,iškreiptas)
Išsaugojus nuskaitymą PNG formatu, išlaikoma dokumento kokybė.
Išvesties rodymas
Išveskite nuskaityto dokumento vaizdą:
cv2.imshow(„Galutinis nuskaitytas vaizdas“, imutils.resize (iškreiptas, aukštis=650))
cv2.waitKey(0)
cv2.destroyAllWindows()
Toliau pateiktame paveikslėlyje parodyta programos išvestis, nuskaityto dokumento nuotrauka.
Kaip tobulėti kompiuterinės vizijos srityje
Dokumentų skaitytuvo kūrimas apima kai kurias pagrindines kompiuterinio matymo sritis, o tai yra plati ir sudėtinga sritis. Norėdami tobulėti kompiuterinės vizijos srityje, turėtumėte dirbti su įdomiais, bet sudėtingais projektais.
Taip pat turėtumėte perskaityti daugiau apie tai, kaip galite naudoti kompiuterinį regėjimą su dabartinėmis technologijomis. Tai jus informuos ir suteiks naujų idėjų projektams įgyvendinti.