Tādi lasītāji kā jūs palīdz atbalstīt MUO. Veicot pirkumu, izmantojot saites mūsu vietnē, mēs varam nopelnīt filiāles komisiju. Lasīt vairāk.

Iespējams, vēlēsities digitalizēt dokumentu, lai ietaupītu fizisko vietu vai izveidotu saglabāšanas dublējumu. Jebkurā gadījumā programmas rakstīšana, kas var pārvērst jūsu papīra failu fotoattēlus standarta formātā, ir uzdevums, ar kuru Python ir izcils uzdevums.

Izmantojot atbilstošu bibliotēku kombināciju, varat izveidot nelielu lietotni dokumentu digitalizēšanai. Programma izmantos fiziska dokumenta attēlu kā ievadi, izmantos tam vairākas attēlu apstrādes metodes un izvadīs ievades skenētu versiju.

Vides sagatavošana

Lai sekotu šim rakstam, jums jāzina Python pamati. Jums arī jābūt izpratnei par kā strādāt ar NumPy Python bibliotēku.

Atveriet jebkuru Python IDE un izveidojiet divus Python failus. Nosauciet vienu main.py un otru transform.py. Pēc tam terminālī palaidiet šādu komandu, lai instalētu vajadzīgās bibliotēkas.

pip instalēt OpenCV-Python imutils scikit-image NumPy
instagram viewer

Lai veiktu attēla ievadi un veiktu attēla apstrādi, izmantosit OpenCV-Python. Imutils, lai mainītu ievades un izvades attēlu izmērus. scikit-image, lai attēlam piemērotu slieksni. NumPy palīdzēs jums strādāt ar masīviem.

Pagaidiet, līdz instalēšana tiks pabeigta un IDE atjauninās projekta skeletus. Kad skeletu atjaunināšana ir pabeigta, esat gatavs sākt kodēšanu. Pilns avota kods ir pieejams a GitHub repozitorijs.

Instalēto bibliotēku importēšana

Atveriet failu main.py un importējiet vidē instalētās bibliotēkas. Tas ļaus jums piezvanīt un vajadzības gadījumā izmantot viņu funkcijas.

imports cv2
imports imutils
no skimage.filtri imports slieksnis_vietējais
no pārveidot imports perspektīva_transformācija

Ignorējiet kļūdu, ko rada perspektīva_transform. Tas pazudīs, kad pabeigsit darbu pie transform.py faila.

Ievades ņemšana un lieluma maiņa

Uzņemiet skaidru skenējamā dokumenta attēlu. Pārliecinieties, vai ir redzami dokumenta četri stūri un tā saturs. Kopējiet attēlu tajā pašā mapē, kurā glabājat programmas failus.

Nododiet ievades attēla ceļu uz OpenCV. Izveidojiet oriģinālā attēla kopiju, jo tā būs nepieciešama perspektīvas transformācijas laikā. Sadaliet sākotnējā attēla augstumu ar augstumu, līdz kuram vēlaties mainīt tā izmēru. Tas saglabās malu attiecību. Visbeidzot, izvadiet mainītā izmēra attēlu.

# Iziet attēla ceļu
original_img = cv2.imread("sample.jpg")
kopija = original_img.copy()

# Mainītais augstums simtos
attiecība = oriģināls_attēls.forma[0] / 500.0
img_resize = imutils.resize (original_img, height=500)

# Tiek rādīta izvade
cv2.imshow("Mainīts attēla izmērs", img_resize)

# Gaida, līdz lietotājs nospiež jebkuru taustiņu
cv2.waitKey(0)

Iepriekš minētā koda izvade ir šāda:

Jūs tagad esat mainījis sākotnējā attēla augstumu uz 500 pikseļiem.

Mainītā attēla pārvēršana pelēktoņos

Pārveidojiet mainītā izmēra RGB attēlu pelēktoņos. Lielākā daļa attēlu apstrādes bibliotēku darbojas tikai ar pelēktoņu attēliem, jo ​​tos ir vieglāk apstrādāt.

gray_image = cv2.cvtColor (img_resize, cv2.COLOR_BGR2GRAY)
cv2.imshow("Pelēks attēls", pelēks_attēls)
cv2.waitKey(0)

Ievērojiet atšķirību starp sākotnējo attēlu un pelēko attēlu.

Krāsainais galds ir kļuvis melnbalts.

Malu detektora pielietošana

Izmantojiet Gausa izplūšanas filtru pelēkotajam attēlam, lai noņemtu troksni. Pēc tam izsauciet OpenCV canny funkciju, lai noteiktu attēlā esošās malas.

blurred_image = cv2.GaussianBlur (pelēks_attēls, (5, 5), 0)
edged_img = cv2.Canny (izplūdušais_attēls, 75, 200)
cv2.imshow("Attēla malas", edged_img)
cv2.waitKey(0)

Izvadā ir redzamas malas.

Malas, ar kurām strādāsit, ir tās, kas ir dokumentā.

Lielākās kontūras atrašana

Atklājiet apmales attēlā esošās kontūras. Sakārtojiet tos dilstošā secībā, saglabājot tikai piecas lielākās kontūras. Aptuviniet lielāko kontūru ar četrām malām, izlaižot cilpu cauri sakārtotajām kontūrām.

cnts, _ = cv2.findContours (edged_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = sakārtots (cnts, atslēga=cv2.contourArea, reverse=Taisnība)[:5]

priekš c iekšā cnts:
peri = cv2.arcLength (c, Taisnība)
aptuveni = cv2.approxPolyDP(c, 0.02 * peri, Taisnība)

ja len (aptuveni) == 4:
doc = apm
pārtraukums

Kontūra ar četrām pusēm, visticamāk, satur dokumentu.

Dokumenta kontūras četru stūru riņķošana

Apvelciet atpazītā dokumenta kontūras stūrus. Tas palīdzēs jums noteikt, vai jūsu programma varēja noteikt attēlu attēlā.

p = []

priekš d iekšā dok.:
tuple_point = kortežs (d[0])
cv2.circle (img_resize, tuple_point, 3, (0, 0, 255), 4)
p.append (koreja_punkts)

cv2.imshow("Apvilkti stūra punkti", img_resize)
cv2.waitKey(0)

Ieviesiet riņķošanu uz mainītā izmēra RGB attēla.

Pēc dokumenta noteikšanas jums tas ir jāizņem no attēla.

Izmantojot deformācijas perspektīvu, lai iegūtu vēlamo attēlu

Metu perspektīva ir datorredzes paņēmiens attēla pārveidošanai, lai izlabotu izkropļojumus. Tas pārveido attēlu citā plaknē, ļaujot skatīt attēlu no cita leņķa.

warped_image = perspektīvas_pārveidot (kopēt, doc.reshape(4, 2) * attiecība)
warped_image = cv2.cvtColor (izkropļots_attēls, cv2.COLOR_BGR2GRAY)
cv2.imshow("Izliekts attēls", imutils.resize (izkropļots_attēls, augstums=650))
cv2.waitKey(0)

Lai iegūtu deformētu attēlu, jums ir nepieciešams izveidot vienkāršu moduli kas veiks perspektīvas transformāciju.

Transformācijas modulis

Modulis sakārtos dokumenta stūru punktus. Tas arī pārveidos dokumenta attēlu citā plaknē un mainīs kameras leņķi uz augšējo kadru.

Atveriet iepriekš izveidoto transform.py failu. Importējiet OpenCV un NumPy bibliotēkas.

imports nejutīgs  np
imports cv2

Šajā modulī būs divas funkcijas. Izveidojiet funkciju, kas sakārtos dokumenta stūra punktu koordinātas. Pirmā koordināte būs augšējā kreisajā stūrī, otrā būs augšējā labā stūra koordināte, trešā būs apakšējā labajā stūrī, bet ceturtā koordināte būs apakšējā kreisajā stūrī stūrī.

deforder_points(punkti):
# inicializējot pasūtāmo koordinātu sarakstu
rect = np.zeros((4, 2), dtype = "float32")

s = pts.sum (ass = 1)

# augšējā kreisajā punktā būs mazākā summa
taisni[0] = pts[np.argmin (s)]

# apakšējā labajā punktā būs lielākā summa
taisni[2] = punkti[np.argmax (s)]

aprēķina starpību starp punktiem,
augšējā labajā punktā būs mazākā atšķirība,
tā kā apakšējā kreisajā pusē būs vislielākā atšķirība
diff = np.diff (pts, ass = 1)
taisni[1] = pts[np.argmin (atšķirība)]
taisni[3] = pts[np.argmax (atšķirība)]

# atgriež pasūtītās koordinātas
atgriezties taisn

Izveidojiet otru funkciju, kas aprēķinās jaunā attēla stūra koordinātas un iegūs augšējo kadru. Pēc tam tas aprēķinās perspektīvas transformācijas matricu un atgriezīs deformēto attēlu.

defperspektīva_transformācija(attēls, punkti):
# atsevišķi izpakojiet pasūtītās koordinātas
taisnais = order_points (punkti)
(tl, tr, br, bl) = taisn

aprēķiniet jaunā attēla platumu, kas būs
maksimālais attālums starp apakšējo labo pusi un apakšā pa kreisi
x-koordinātas vai augšējā labajā stūrī un augšējās kreisās puses x-koordinātas
platumsA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
platumsB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max (int (widthA), int (widthB))

aprēķiniet jaunā attēla augstumu, kas būs
maksimālais attālums starp augšējo kreiso pusi un apakšējās kreisās puses y-koordinātas
augstumsA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
augstumsB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maxHeight = max (int (heightA), int (heightB))

izveidot galapunktu kopu, lai iegūtu augšējo kadru
dst = np.array([
[0, 0],
[maxWidth - 1, 0],
[maxWidth - 1, maksimālais augstums - 1],
[0, maksimālais augstums - 1]], dtype = "float32")

# aprēķina perspektīvas transformācijas matricu
transform_matrix = cv2.getPerspectiveTransform (rekts, dst)

# Lietojiet transformācijas matricu
deformēts = cv2.warpPerspective (attēls, transformācijas_matrica, (maksimālais platums, maksimālais augstums))

# atgriezt deformēto attēlu
atgriezties deformēts

Tagad esat izveidojis transformācijas moduli. Kļūda par perspektīvas_transformācijas importēšanu tagad pazudīs.

Ņemiet vērā, ka parādītajam attēlam ir kadrs virs galvas.

Adaptīvā sliekšņa lietošana un skenētās izvades saglabāšana

Main.py failā izkropļotajam attēlam piemērojiet Gausa slieksni. Tas piešķirs deformētajam attēlam skenētu izskatu. Saglabājiet skenētā attēla izvadi mapē, kurā ir programmas faili.

T = slieksnis_lokālais (izkropļots_attēls, 11, nobīde=10, metode="gauss")
deformēts = (izkropļots_attēls > T).astype("uint8") * 255
cv2.imwrite('./'+'skenēt'+".png", deformēts)

Saglabājot skenējumu PNG formātā, tiek saglabāta dokumenta kvalitāte.

Izvades parādīšana

Izvadiet skenētā dokumenta attēlu:

cv2.imshow("Pēdējais skenētais attēls", imutils.resize (izlocīts, augstums=650))
cv2.waitKey(0)
cv2.destroyAllWindows()

Nākamajā attēlā ir parādīta programmas izvade, skenētā dokumenta augšējais kadrs.

Kā virzīties uz priekšu datorredzē

Dokumentu skenera izveide aptver dažas galvenās datora redzes jomas, kas ir plaša un sarežģīta joma. Lai virzītos uz priekšu datorredzē, jums jāstrādā pie interesantiem, bet izaicinošiem projektiem.

Jums vajadzētu arī lasīt vairāk par to, kā izmantot datorredzi ar pašreizējām tehnoloģijām. Tas jūs informēs un sniegs jaunas idejas projektiem, pie kuriem strādāt.