Attēlu apstrāde OpenCV

Attelu Apstrade Opencv



Šajā rakstā mēs pētīsim attēlu apstrādes metodes. Mēs izskatīsim dažas fundamentālas, bet kritiskas tēmas datorredzēšanā un mašīnmācībā. Šīs pamata attēlu apstrādes metodes var atrisināt sarežģītas problēmas, piemēram, datu kopas. Tā rezultātā attēlu apstrādē ir seši pamata soļi, kas ir uzskaitīti zemāk:
  1. Attēlu tulkošana
  2. Attēla pagriešana
  3. Attēlu aritmētika
  4. Attēla apgriešana
  5. Attēla apgriešana
  6. Attēla izmēru maiņa

Tagad mēs detalizēti izskaidrosim visas iepriekš minētās attēlu apstrādes tēmas.

1. Attēlu tulkošana

Attēlu tulkošana ir attēlu apstrādes metode, kas palīdz mums pārvietot attēlu pa x un y asīm. Mēs varam pārvietot attēlu uz augšu, uz leju, pa labi, pa kreisi vai jebkuru kombināciju.







Mēs varam definēt Tulkošanas matricu ar simbolu M, un mēs varam to attēlot matemātiskā formā, kā parādīts zemāk:





Izmantojot šo programmu, mēs varam saprast tulkošanas attēla jēdzienu.





Python kods: Mēs saglabāsim šādas programmas nosaukumu kā translate.py .

# importējiet nepieciešamo pakotni

imports nejutīgs piem.

imports argparse

imports imutils

imports cv2

# mēs ieviešam argumentu parsētāju

ap_obj = argparse. ArgumentParser ( )

ap_obj. add_argument ( '-k' , '--attēls' , nepieciešams = Taisnība ,

palīdzēt = 'attēla faila atrašanās vieta' )

args = kuru ( ap_obj. parse_args ( ) )

# ielādējiet attēlu un parādiet to ekrānā

attēlu = cv2. nelasīts ( args [ 'attēls' ] )

cv2. imshow ( 'Original_image' , attēlu )

# Attēla tulkošana ir NumPy matrica, kas norādīta zemāk:

# [[1, 0, shiftX], [0, 1, shiftY]]

# Mēs izmantosim iepriekš minēto NumPy matricu, lai pārvietotu attēlus pa

# x ass un y ass virzieni. Lai to izdarītu, mums vienkārši jānodod pikseļu vērtības.

# Šajā programmā mēs pārvietosim attēlu par 30 pikseļiem pa labi

# un 70 pikseļi virzienā uz leju.

tulkošanas_paklājs = piem. pludiņš32 ( [ [ 1 , 0 , 30 ] , [ 0 , 1 , 70 ] ] )

image_translation = cv2. warpAffine ( attēlu , tulkošanas_paklājs ,

( attēlu. forma [ 1 ] , attēlu. forma [ 0 ] ) )

cv2. imshow ( 'Attēlu tulkošana uz leju un pa labi' , image_translation )

# tagad mēs izmantosim iepriekš minēto NumPy matricu, lai pārvietotu attēlus pa

# x-ass (pa kreisi) un y-ass (augšup) virzieni.

# Šeit mēs pārvietosim attēlus par 50 pikseļiem pa kreisi

# un 90 pikseļi virzienā uz augšu.

tulkošanas_paklājs = piem. pludiņš32 ( [ [ 1 , 0 , - piecdesmit ] , [ 0 , 1 , - 90 ] ] )

image_translation = cv2. warpAffine ( attēlu , tulkošanas_paklājs ,

( attēlu. forma [ 1 ] , attēlu. forma [ 0 ] ) )

cv2. imshow ( 'Attēlu tulkošana uz augšu un pa kreisi' , image_translation )

cv2. gaidiet taustiņu ( 0 )

1. līdz 5. rinda: Mēs importējam visas šai programmai nepieciešamās pakotnes, piemēram, OpenCV, argparser un NumPy. Lūdzu, ņemiet vērā, ka ir vēl viena bibliotēka, kas ir imutils. Šī nav OpenCV pakotne. Šī ir tikai bibliotēka, kas viegli parādīs to pašu attēlu apstrādi.



Instalējot OpenCV, bibliotēkas imutils netiks iekļauts automātiski. Tātad, lai instalētu imutils, mums ir jāizmanto šāda metode:

pip install imutils

No 8. līdz 15. rindiņai: Mēs izveidojām savu agrparseru un ielādējām attēlu.

24. līdz 25. rinda: Šī programmas sadaļa ir vieta, kur notiek tulkošana. Tulkošanas matrica norāda, cik pikseļus attēls tiks pārvietots uz augšu vai uz leju, vai pa kreisi vai pa labi. Tā kā OpenCV pieprasa, lai matricas vērtība būtu peldošā komata masīvā, tulkošanas matrica ņem vērtības peldošā komata masīvā.

Tulkošanas matricas pirmā rinda izskatās šādi:

Šī matricas rinda ir paredzēta x asij. Vērtība t x izlems, vai attēls tiks pārvietots uz kreiso vai labo pusi. Ja mēs izturēsim negatīvu vērtību, tas nozīmē, ka attēls tiks pārvietots uz kreiso pusi, un, ja vērtība ir pozitīva, tas nozīmē, ka attēls tiks pārvietots uz labo pusi.

Tagad mēs definēsim otro matricas rindu šādi:

Šī matricas rinda ir paredzēta y asij. Vērtība t Y izlems, vai attēls tiks pārvietots uz augšu vai uz leju. Ja mēs izturēsim negatīvu vērtību, tas nozīmē, ka attēls tiks nobīdīts uz augšu, un, ja vērtība ir pozitīva, tas nozīmē, ka attēls tiks novirzīts uz negatīvo pusi.

Iepriekšējā programmā 24. rindā mēs definējam t x = 30 un t Y = 70. Tātad mēs pārvietojam attēlu par 30 pikseļiem uz labo pusi un par 70 pikseļiem uz leju.

Bet galvenais attēlu tulkošanas process notiek 25. rindā, kur mēs definējam tulkošanas matricu cv2.warpAffine . Šajā funkcijā mēs nododam trīs parametrus: pirmais parametrs ir attēls, otrais parametrs ir tulkošanas matrica un trešais parametrs ir attēla dimensija.

27. rindiņa: 27. rindiņa izvadā parādīs rezultātu.

Tagad mēs ieviesīsim citu tulkošanas matricu kreisajai un otrādi. Šim nolūkam mums ir jādefinē vērtības negatīvi.

33. līdz 34. rinda: Iepriekšējā programmā 33. rindā mēs definējam t x = -50 un t Y = -90. Tātad mēs pārvietojam attēlu par 50 pikseļiem uz kreiso pusi un par 90 pikseļiem uz augšu. Bet galvenais attēlu tulkošanas process notiek 34. rindā, kur mēs definējam tulkošanas matricu cv2.warpAffine .

36. rinda : 36. rindā tiks parādīts rezultāts, kā parādīts izvadē.

Lai palaistu iepriekšējo kodu, mums ir jānorāda attēla ceļš, kā norādīts tālāk.

Izvade: python translate.py –attēls vāvere.jpg

Tagad mēs ieviesīsim to pašu attēlu tulkošanas programmu, izmantojot imutils bibliotēka. Šo bibliotēku ir ļoti viegli izmantot attēlu apstrādei. Šajā bibliotēkā mums nav jādomā par cv2.warpAffine jo šī bibliotēka par to parūpēsies. Tāpēc ieviesīsim šo attēlu tulkošanas programmu, izmantojot imutils bibliotēku.

Python kods: Mēs saglabāsim šādas programmas nosaukumu kā translate_imutils.py .

# importēt nepieciešamās paketes

imports nejutīgs piem.

imports argparse

imports imutils

imports cv2

# Šī funkcija ievieš attēla tulkošanu un

# atgriež tulkoto attēlu izsaucējai funkcijai.

def tulkot ( attēlu , x , Y ) :

tulkošanas_matrica = piem. pludiņš32 ( [ [ 1 , 0 , x ] , [ 0 , 1 , Y ] ] )

image_translation = cv2. warpAffine ( attēlu , tulkošanas_matrica ,

( attēlu. forma [ 1 ] , attēlu. forma [ 0 ] ) )

atgriezties image_translation

# izveidojiet argumentu parsētāju un parsējiet argumentus

ap = argparse. ArgumentParser ( )

ap. pievienot_argumentu ( '-i' , '--attēls' , nepieciešams = Taisnība , palīdzēt = 'Ceļš uz attēlu' )

args = kuru ( ap. parse_args ( ) )

# ielādējiet attēlu un parādiet to ekrānā

attēlu = cv2. nelasīts ( args [ 'attēls' ] )

cv2. imshow ( 'Original_image' , attēlu )

image_translation = imutils. tulkot ( attēlu , 10 , 70 )

cv2. imshow ( 'Attēla tulkojums pa labi un negatīvie' ,

image_translation )

cv2. gaidiet taustiņu ( 0 )

9. līdz 13. rinda: Šī programmas sadaļa ir vieta, kur notiek tulkojums. Tulkošanas matrica informē mūs par to, cik pikseļus attēls tiks pārvietots uz augšu vai uz leju, vai pa kreisi vai pa labi.

Šīs rindas jau ir izskaidrotas, taču tagad mēs izveidosim funkciju ar nosaukumu translate () un nosūtīsim tai trīs atšķirīgus parametrus. Pats attēls kalpo kā pirmais parametrs. Tulkošanas matricas x un y vērtības atbilst otrajam un trešajam parametram.

Piezīme : šī tulkošanas funkcija programmā nav jādefinē, jo tā jau ir iekļauta imutils bibliotēkas pakotnē. Es to izmantoju programmā, lai tie būtu saprotami. Mēs varam izsaukt šo funkciju tieši ar imutiliem, kā parādīts 24. rindā.

24. rindiņa: Iepriekšējā programma parādīs, ka 24. rindā mēs definējam tx = 10 un ty = 70. Tātad mēs pārvietojam attēlu par 10 pikseļiem uz labo pusi un par 70 pikseļiem uz leju.

Šajā programmā mēs nerūpējamies par cv2.warpAffine funkcijām, jo ​​tās jau atrodas imutils bibliotēkas pakotnē.

Lai palaistu iepriekšējo kodu, mums ir jānorāda attēla ceļš, kā norādīts tālāk:

Izvade:

python imutils. py --attēlu vāvere. jpg

2. Attēla pagriešana

Iepriekšējā nodarbībā (vai jebkurā kombinācijā) apskatījām, kā tulkot (t.i., pārvietot) attēlu uz augšu, uz leju, pa kreisi un pa labi. Tālāk mēs apspriedīsim rotāciju saistībā ar attēlu apstrādi.

Attēls tiek pagriezts ar leņķi, teta, procesā, kas pazīstams kā rotācija. Leņķis, par kādu mēs pagriežam attēlu, tiks attēlots ar teta. Turklāt es pēc tam nodrošināšu pagriešanas ērtību funkciju, lai attēlu pagriešana būtu vienkāršāka.

Līdzīgi tulkošanai un, iespējams, nav pārsteidzoši, rotācijai ar leņķi, teta nosaka, veidojot matricu M šādā formātā:

Šī matrica var pagriezt vektora teta grādus (pretēji pulksteņrādītāja virzienam) ap doto (x, y) - Dekarta plakni. Parasti šajā scenārijā izcelsme būtu attēla centrs, bet patiesībā mēs varētu norādīt jebkuru nejaušu (x, y) punktu kā mūsu rotācijas centru.

Pēc tam pagrieztais attēls R tiek izveidots no sākotnējā attēla I, izmantojot vienkāršu matricas reizināšanu: R = IM

No otras puses, OpenCV papildus piedāvā iespēju (1) mērogot (t.i., mainīt attēla izmēru) un (2) piedāvāt patvaļīgu rotācijas centru, lai veiktu rotāciju.

Mūsu modificētā rotācijas matrica M ir parādīta zemāk:

Sāksim ar jauna faila atvēršanu un ģenerēšanu pagriezt.py :

# nepieciešamo pakotņu importēšana

imports nejutīgs piem.

imports argparse

imports imutils

imports cv2

# izveidojot argumentparser objektu un parsēšanas argumentu

apobj = argparse. ArgumentParser ( )

apobj. add_argument ( '-k' , '--attēls' , nepieciešams = Taisnība , palīdzēt = 'attēla ceļš' )

argumenti = kuru ( apobj. parse_args ( ) )

attēlu = cv2. nelasīts ( argumenti [ 'attēls' ] )

cv2. imshow ( 'Original_image' , attēlu )

# Aprēķiniet attēla centru, izmantojot attēla izmērus.

( augstums , platums ) = attēlu. forma [ : 2 ]

( centrsX , centrsY ) = ( platums / 2 , augstums / 2 )

# Tagad, izmantojot cv2, mēs pagriezīsim attēlu par 55 grādiem uz

# noteikt rotācijas matricu, izmantojot getRotationMatrix2D()

rotācijasMatrica = cv2. getRotationMatrix2D ( ( centrsX , centrsY ) , 55 , 1.0 )

pagrieztsAttēls = cv2. warpAffine ( attēlu , rotācijasMatrica , ( platums , augstums ) )

cv2. imshow ( 'Pagriezts attēls par 55 grādiem' , pagrieztsAttēls )

cv2. gaidiet taustiņu ( 0 )

# Tagad attēls tiks pagriezts par -85 grādiem.

rotācijasMatrica = cv2. getRotationMatrix2D ( ( centrsX , centrsY ) , - 85 , 1.0 )

pagrieztsAttēls = cv2. warpAffine ( attēlu , rotācijasMatrica , ( platums , augstums ) )

cv2. imshow ( 'Pagriezts attēls par -85 grādiem' , pagrieztsAttēls )

cv2. gaidiet taustiņu ( 0 )

1. līdz 5. rinda: Mēs importējam visas šai programmai nepieciešamās pakotnes, piemēram, OpenCV, argparser un NumPy. Lūdzu, ņemiet vērā, ka ir vēl viena bibliotēka, kas ir imutils. Šī nav OpenCV pakotne. Šī ir tikai bibliotēka, kas tiks izmantota, lai viegli parādītu to pašu attēlu apstrādi.

Instalējot OpenCV, bibliotēkas imutils netiks iekļauts automātiski. OpenCV instalē imutils. Mums ir jāizmanto šāda metode:

pip install imutils

No 8. līdz 14. rindiņai: Mēs izveidojām savu agrparseru un ielādējām attēlu. Šajā argparsētājā mēs izmantojam tikai vienu attēla argumentu, kas mums pateiks attēla ceļu, ko izmantosim šajā programmā, lai demonstrētu rotāciju.

Pagriežot attēlu, mums ir jādefinē rotācijas pagrieziena punkts. Lielāko daļu laika vēlaties pagriezt attēlu ap tā centru, taču OpenCV tā vietā ļauj izvēlēties jebkuru nejaušu punktu. Vienkārši pagrieziet attēlu ap tā centru.

No 17. līdz 18. rindai paņemiet attiecīgi attēla platumu un augstumu un pēc tam sadaliet katru izmēru ar diviem, lai noteiktu attēla centru.

Mēs izveidojam matricu attēla pagriešanai tāpat kā mēs definējām matricu attēla tulkošanai. Mēs vienkārši piezvanīsim cv2.getRotationMatrix2D funkciju 22. rindā, nevis manuāli izveidot matricu, izmantojot NumPy (kas var būt nedaudz apgrūtinoši).

The cv2.getRotationMatrix2D funkcijai nepieciešami trīs parametri. Pirmā ievade ir vēlamais griešanās leņķis (šajā gadījumā attēla centrs). Pēc tam teta tiek izmantots, lai norādītu, par cik grādiem (pretēji pulksteņrādītāja virzienam) mēs pagriezīsim attēlu. Šeit mēs pagriezīsim attēlu par 45 grādiem. Pēdējā iespēja ir saistīta ar attēla izmēru.

Neatkarīgi no tā, ka mēs vēl neesam apsprieduši attēla mērogošanu, šeit varat norādīt peldošā komata skaitli ar 1,0, kas norāda, ka attēls ir jāizmanto tā sākotnējās proporcijās. Tomēr, ja ierakstāt vērtību 2,0, attēla izmērs dubultosies. Skaitlis 0,5 samazina attēla izmēru.

22. līdz 23. rinda: Pēc mūsu rotācijas matricas M saņemšanas no cv2.getRotationMatrix2D funkciju, mēs pagriežam savu attēlu, izmantojot cv2.warpAffine tehnika 23. rindā. Funkcijas pirmā ievade ir attēls, kuru vēlamies pagriezt. Pēc tam tiek noteikts mūsu izvadītā attēla platums un augstums kopā ar mūsu rotācijas matricu M. 23. rindā attēls tiek pagriezts par 55 grādiem.

Varat pamanīt, ka mūsu attēls ir pagriezts.

28. līdz 30. rinda veido otro rotāciju. Koda 22.–23. rindiņas ir identiskas, izņemot to, ka šoreiz mēs pagriežam par -85 grādiem pretstatā 55.

Mēs esam vienkārši pagriezuši attēlu ap tā centru līdz šim punktam. Ko darīt, ja mēs vēlētos pagriezt attēlu ap nejaušu punktu?

Sāksim ar jauna faila atvēršanu un ģenerēšanu rotate.py:

# nepieciešamo pakotņu importēšana

imports nejutīgs piem.

imports argparse

imports imutils

imports cv2

# izveidojot argumentparser objektu un parsēšanas argumentu

ap_obj = argparse. ArgumentParser ( )

ap_obj. add_argument ( '-k' , '--attēls' , nepieciešams = Taisnība , palīdzēt = 'attēla ceļš' )

arguments = kuru ( ap_obj. parse_args ( ) )

# ielādējiet attēlu un parādiet to ekrānā

attēlu = cv2. nelasīts ( arguments [ 'attēls' ] )

cv2. imshow ( 'Original_image' , attēlu )

# Aprēķiniet attēla centru, izmantojot attēla izmērus.

( augstums , platums ) = attēlu. forma [ : 2 ]

( centrsX , centrsY ) = ( platums / 2 , augstums / 2 )

# Tagad, izmantojot cv2, mēs pagriezīsim attēlu par 55 grādiem uz

# noteikt rotācijas matricu, izmantojot getRotationMatrix2D()

rotācijasMatrica = cv2. getRotationMatrix2D ( ( centrsX , centrsY ) , 55 , 1.0 )

pagrieztsAttēls = cv2. warpAffine ( attēlu , rotācijasMatrica , ( platums , augstums ) )

cv2. imshow ( 'Pagriezts attēls par 55 grādiem' , pagrieztsAttēls )

cv2. gaidiet taustiņu ( 0 )

# Tagad attēls tiks pagriezts par -85 grādiem.

rotācijasMatrica = cv2. getRotationMatrix2D ( ( centrsX , centrsY ) , - 85 , 1.0 )

pagrieztsAttēls = cv2. warpAffine ( attēlu , rotācijasMatrica , ( platums , augstums ) )

cv2. imshow ( 'Pagriezts attēls par -85 grādiem' , pagrieztsAttēls )

cv2. gaidiet taustiņu ( 0 )

# attēla pagriešana no kāda patvaļīga punkta, nevis no centra

rotācijasMatrica = cv2. getRotationMatrix2D ( ( centrsX - 40 , centrs Y - 40 ) , 55 , 1.0 )

pagrieztsAttēls = cv2. warpAffine ( attēlu , rotācijasMatrica , ( platums , augstums ) )

cv2. imshow ( 'Attēla pagriešana no patvaļīgiem punktiem' , pagrieztsAttēls )

cv2. gaidiet taustiņu ( 0 )

34. līdz 35. rinda: Tagad šim kodam vajadzētu šķist diezgan izplatītam objekta pagriešanai. Lai pagrieztu attēlu ap punktu 40 pikseļus pa kreisi un 40 pikseļus virs tā centra, mēs instrukcijām cv2.getRotationMatrix2D funkcija, lai pievērstu uzmanību tā pirmajam parametram.

Attēls, kas iegūts, kad mēs izmantojam šo rotāciju, ir parādīts zemāk:

Mēs varam skaidri redzēt, ka rotācijas centrs tagad ir (x, y)-koordināta, kas atrodas 40 pikseļus pa kreisi un 40 pikseļus virs aprēķinātā attēla centra.

3. Attēlu aritmētika

Faktiski attēla aritmētika ir tikai matricas pievienošana ar dažiem papildu ierobežojumiem datu veidiem, par kuriem mēs runāsim vēlāk.

Apskatīsim dažus lineārās algebras pamatus.

Apsveriet iespēju apvienot divas nākamās matricas:

Kādu rezultātu radītu matricas pievienošana? Vienkāršā atbilde ir matricas ierakstu summa elementam pa elementam:

Pietiekami vienkārši, vai ne?

Mēs visi šobrīd saprotam saskaitīšanas un atņemšanas pamatoperācijas. Tomēr, strādājot ar attēliem, mums ir jāņem vērā ierobežojumi, ko nosaka mūsu krāsu telpa un datu tips.

Piemēram, pikseļi RGB attēlos ir no [0, 255]. Kas notiek, ja mēs mēģināsim pievienot 10 pikselim ar intensitāti 250, skatoties uz to?

Mēs iegūtu vērtību 260, ja piemērotu standarta aritmētikas principus. 260 nav derīga vērtība, jo RGB attēli tiek attēloti kā 8 bitu veseli skaitļi bez paraksta.

Tātad, kam būtu jānotiek? Vai mums ir jāveic pārbaude, lai pārliecinātos, ka neviens pikselis nepārsniedz diapazonu [0, 255], nogriežot katru pikseļu, lai tā vērtība būtu no 0 līdz 255?

Vai arī “aptinam” un veicam moduļa darbību? Saskaņā ar moduļa noteikumiem, pievienojot 10 uz 255, iegūtā vērtība būtu 9.

Kā būtu jārīkojas ar saskaitīšanu un atņemšanu attēliem, kas pārsniedz [0, 255] diapazonu?

Patiesība ir tāda, ka nav pareizas vai nepareizas tehnikas; tas viss ir atkarīgs no tā, kā jūs strādājat ar saviem pikseļiem un ko jūs cerat sasniegt.

Bet atcerieties, ka pastāv atšķirības starp pievienošanu OpenCV un pievienošanu NumPy. Moduļu aritmētiku un “aptīšanu” veiks NumPy. Turpretim OpenCV veiks izgriešanu un nodrošinās, ka pikseļu vērtības nekad neatstāj diapazonu [0, 255].

Sāksim, izveidojot jaunu failu ar nosaukumu aritmētika.py un atverot to:

# python arithmetic.py --attēls vāvere.jpg

# nepieciešamo pakotņu importēšana

imports nejutīgs piem.

imports argparse

imports imutils

imports cv2

# izveidojot argumentparser objektu un parsēšanas argumentu

apObj = argparse. ArgumentParser ( )

apObj. add_argument ( '-k' , '--attēls' , nepieciešams = Taisnība , palīdzēt = 'attēla ceļš' )

argumenti = kuru ( apObj. parse_args ( ) )

attēlu = cv2. nelasīts ( argumenti [ 'attēls' ] )

cv2. imshow ( 'Original_image' , attēlu )

'''

Mūsu pikseļu vērtības būs diapazonā [0, 255]

jo attēli ir NumPy masīvi, kas tiek saglabāti kā neparakstīti 8 bitu veseli skaitļi.

Izmantojot tādas funkcijas kā cv2.add un cv2.subtract, vērtības tiks apgrieztas

šim diapazonam, pat ja tie tiek pievienoti vai atņemti no ārpuses

[0, 255] diapazons. Šeit ir ilustrācija:

'''


drukāt ( 'maksimums 255: {}' . formātā ( str ( cv2. pievienot ( piem. uint8 ( [ 201 ] ) ,

piem. uint8 ( [ 100 ] ) ) ) ) )

drukāt ( 'vismaz 0: {}' . formātā ( str ( cv2. atņemt ( piem. uint8 ( [ 60 ] ) ,

piem. uint8 ( [ 100 ] ) ) ) ) )

'''

Veicot aritmētiskās darbības ar šiem masīviem, izmantojot NumPy,

vērtība tiks apvilkta, nevis tiks apgriezta

[0, 255]diapazons. Izmantojot attēlus, ir svarīgi to saglabāt

prātā.

'''


drukāt ( 'aptīt: {}' . formātā ( str ( piem. uint8 ( [ 201 ] ) + piem. uint8 ( [ 100 ] ) ) ) )

drukāt ( 'aptīt: {}' . formātā ( str ( piem. uint8 ( [ 60 ] ) - piem. uint8 ( [ 100 ] ) ) ) )

'''

Reizināsim katra attēla pikseļa spilgtumu ar 101.

Lai to izdarītu, mēs ģenerējam NumPy masīvu, kas ir tāda paša izmēra kā mūsu matrica,

piepildīta ar vieniniekiem, un reiziniet to ar 101, lai iegūtu aizpildītu masīvu

ar 101. Visbeidzot, mēs apvienojam abus attēlus.

Jūs ievērosiet, ka attēls tagad ir 'spilgtāks'.

'''


Matrica = piem. vieni ( attēlu. forma , dtype = 'uint8' ) * 101

attēls_pievienots = cv2. pievienot ( attēlu , Matrica )

cv2. imshow ( 'Pievienots attēla rezultāts' , attēls_pievienots )

#Līdzīgā veidā mēs varam padarīt savu attēlu tumšāku, uzņemot

# 60 attālumā no visiem pikseļiem.

Matrica = piem. vieni ( attēlu. forma , dtype = 'uint8' ) * 60

attēls_atņemts = cv2. atņemt ( attēlu , Matrica )

cv2. imshow ( 'Atņemtais attēla rezultāts' , attēls_atņemts )

cv2. gaidiet taustiņu ( 0 )

No 1. līdz 16. rindiņai tiks izmantots, lai veiktu mūsu parasto procesu, kas ietver mūsu pakotņu importēšanu, argumentu parsētāja konfigurēšanu un attēla ielādi.

Atcerieties, kā es iepriekš apspriedu atšķirību starp OpenCV un NumPy pievienošanu? Tagad, kad esam to rūpīgi apskatījuši, apskatīsim konkrētu gadījumu, lai pārliecinātos, ka mēs to saprotam.

Ir definēti divi 8 bitu neparakstīti veselu skaitļu NumPy masīvi 26. rinda . Vērtība 201 ir vienīgais elements pirmajā masīvā. Lai gan otrajā masīvā ir tikai viens dalībnieks, tā vērtība ir 100. Pēc tam vērtības tiek pievienotas, izmantojot OpenCV funkciju cv2.add.

Kāds, jūsuprāt, būs rezultāts?

Saskaņā ar parastajiem aritmētikas principiem atbildei jābūt 301. Taču atcerieties, ka mums ir darīšana ar 8 bitu neparakstītiem veseliem skaitļiem, kas var būt tikai diapazonā [0, 255]. Tā kā mēs izmantojam cv2.add metodi, OpenCV apstrādā izgriešanu un nodrošina, ka pievienošana atgriež tikai maksimālo rezultātu 255.

Tālāk esošā saraksta pirmajā rindā ir parādīts šī koda izpildes rezultāts:

aritmētika. py

maksimums no 255 : [ [ 255 ] ]

Summa patiešām radīja 255.

Pēc tam 26. rinda izmanto cv2.subtract, lai veiktu atņemšanu. Vēlreiz mēs definējam divus 8 bitu neparakstītus veselus skaitļus NumPy masīvus ar vienu elementu katrā. Pirmā masīva vērtība ir 60, bet otrā masīva vērtība ir 100.

Mūsu aritmētika nosaka, ka atņemšanas rezultātā ir jāiegūst vērtība -40, bet OpenCV vēlreiz apstrādā izgriešanu mūsu vietā. Mēs atklājam, ka vērtība ir samazināta līdz 0. Tālāk redzamais rezultāts parāda to:

aritmētika. py

minimums no 0 : [ [ 0 ] ]

Izmantojot cv2, atņemiet 100 no 60 atņemšanas, iegūstot vērtību 0.

Bet kas notiek, ja aprēķinu veikšanai mēs izmantojam NumPy OpenCV vietā?

38. un 39. rinda risināt šo jautājumu.

Pirmkārt, tiek definēti divi 8 bitu neparakstīti veselu skaitļu NumPy masīvi ar vienu elementu katrā. Pirmā masīva vērtība ir 201, bet otrā masīva vērtība ir 100. Ja mēs izmantotu funkciju cv2.add, mūsu papildinājums tiktu apgriezts un tiktu atgriezta vērtība 255.

No otras puses, NumPy “apgriež” un veic modulo aritmētiku, nevis izgriež. NumPy apgriež līdz nullei, kad tiek sasniegta vērtība 255, un pēc tam atsāk skaitīšanu, līdz ir sasniegti 100 soļi. To apstiprina pirmā izvades rinda, kas parādīta zemāk:

aritmētika. py
aptīt: [ Četri, pieci ]

Pēc tam tiek definēti vēl divi NumPy masīvi, viens ar vērtību 50 un otrs ar 100. Šī atņemšana tiktu apgriezta ar metodi cv2.subtract, lai atgrieztu rezultātu 0. Taču mēs apzināmies, ka izgriešanas vietā NumPy izpilda. moduļu aritmētika. Tā vietā modulo procedūras apņem un sāk skaitīt atpakaļ no 255, tiklīdz atņemšanas laikā ir sasniegts 0. Mēs to varam redzēt no šādas izvades:

aritmētika. py

aptīt: [ 207 ]

Vēlreiz mūsu termināļa izvade parāda atšķirību starp apgriešanu un aptīšanu:

Veicot veselu skaitļu aritmētiku, ir svarīgi paturēt prātā vēlamo rezultātu. Vai vēlaties, lai tiktu apgrieztas vērtības ārpus diapazona [0, 255]? Pēc tam izmantojiet OpenCV iebūvētās attēlu aritmētiskās metodes.

Vai vēlaties, lai vērtības tiktu apvilktas, ja tās ir ārpus [0, 255] un moduļa aritmētisko darbību diapazona? Pēc tam NumPy masīvus vienkārši pievieno un atņem kā parasti.

48. rinda definē viendimensionālu NumPy masīvu ar tādiem pašiem izmēriem kā mūsu attēlam. Vēlreiz mēs nodrošinām, ka mūsu datu tips ir 8 bitu neparakstīti veseli skaitļi. Mēs vienkārši reizinām savu viencipara vērtību matricu ar 101, lai to aizpildītu ar vērtībām 101, nevis 1. Visbeidzot, mēs izmantojam funkciju cv2.add, lai pievienotu mūsu matricu 100s sākotnējam attēlam. Tas palielina katra pikseļa intensitāti par 101, vienlaikus nodrošinot, ka visas vērtības, kas mēģina pārsniegt 255, tiek apgrieztas diapazonā [0, 255].

Ievērojiet, kā attēls ir ievērojami spilgtāks un šķiet “izskalotāks” nekā oriģināls. Tas ir tāpēc, ka mēs virzām pikseļus uz spilgtākām krāsām, palielinot to pikseļu intensitāti par 101.

Lai no katra attēla pikseļa intensitātes atņemtu 60, vispirms 54. rindā izveidojam otru NumPy masīvu, kas ir piepildīts ar 60. gadiem.

Šīs atņemšanas rezultāti ir parādīti šajā attēlā:

Apkārtējie priekšmeti šķiet ievērojami tumšāki nekā iepriekš. Tas ir tāpēc, ka, atņemot 60 no katra pikseļa, mēs pārvietojam pikseļus RGB krāsu telpā uz tumšākajiem apgabaliem.

4. Attēla apgriešana

Līdzīgi kā pagriešana, attēla apvēršana pa x vai y asi ir vēl viena OpenCV piedāvātā iespēja. Pat ja apgriešanas darbības netiek izmantotas tik bieži, to apzināšana ir neticami izdevīga dažādu iemeslu dēļ, kurus jūs, iespējams, uzreiz neredzat.

Mēs izstrādājam mašīnmācīšanās klasifikatoru mazam jaunuzņēmumam, kas mēģina attēlos identificēt sejas. Lai mūsu sistēma “uzzinātu”, kas ir seja, mums būtu nepieciešama kāda veida datu kopa ar seju paraugiem. Diemžēl uzņēmums mums ir devis tikai nelielu datu kopu ar 40 sejām, un mēs nevaram apkopot vairāk informācijas.

Ko tad mēs darām?

Tā kā seja paliek seja neatkarīgi no tā, vai tā ir atspoguļota vai nē, mēs varam horizontāli apgriezt katru sejas attēlu un izmantot spoguļattēlu versijas kā papildu treniņa datus.

Šis piemērs var šķist muļķīgs un mākslīgs, bet tā nav. Pārvēršana ir apzināta stratēģija, ko izmanto spēcīgi padziļinātas mācīšanās algoritmi, lai apmācības posmā iegūtu vairāk datu.

No iepriekš minētā ir skaidrs, ka šajā modulī apgūtās attēlu apstrādes metodes kalpo par pamatu lielākām datorredzes sistēmām.

Mērķi:

Izmantojot cv2.flip funkciju, šajā sesijā uzzināsiet, kā apgriezt attēlu gan horizontāli, gan vertikāli.

Apvēršana ir nākamā attēla manipulācija, ko mēs pētīsim. Attēla x un y asis var apgriezt vai pat abas. Pirms iedziļināmies kodēšanā, vislabāk ir vispirms apskatīt attēla apvēršanas rezultātus. Skatiet attēlu, kas ir apgriezts horizontāli šajā attēlā:


Ņemiet vērā, kā mūsu sākotnējais attēls atrodas kreisajā pusē un kā attēls ir horizontāli atspoguļots labajā pusē.

Sāksim, izveidojot jaunu failu ar nosaukumu flipping.py .

Jūs redzējāt attēla apvēršanas piemēru, tāpēc apskatīsim kodu:

# python flipping.py --image quirrel.jpg

# nepieciešamo pakotņu importēšana

imports argparse

imports cv2

# izveidojot argumenta parsētāja objektu un parsējiet argumentu

apObj = argparse. ArgumentParser ( )

apObj. add_argument ( '-i' , '--attēls' , nepieciešams = Taisnība , palīdzēt = 'attēla ceļš' )

arguments = kuru ( apObj. parse_args ( ) )

attēlu = cv2. nelasīts ( arguments [ 'attēls' ] )

cv2. imshow ( 'Oriģināls' , attēlu )

# horizontāli apgrieziet attēlu

apgriezts attēls = cv2. uzsist ( attēlu , 1 )

cv2. imshow ( 'Horizontāli apgriezts attēls' , apgriezts attēls )

# vertikāli apgriezt attēlu

apgriezts attēls = cv2. uzsist ( attēlu , 0 )

cv2. imshow ( 'Pagriezts attēls vertikāli' , apgriezts attēls )

# attēla apvēršana pa abām asīm

apgriezts attēls = cv2. uzsist ( attēlu , - 1 )

cv2. imshow ( 'Apgriezts horizontāli un vertikāli' , apgriezts attēls )

cv2. gaidiet taustiņu ( 0 )

Darbības, ko veicam, lai importētu savas pakotnes, parsētu ievades datus un ielādētu attēlu no diska, tiek veiktas l. no 1 līdz 12 .

Izsaucot funkciju cv2.flip 15. rinda , ir vienkārši apgriezt attēlu horizontāli. Attēls, kuru mēs vēlamies apgriezt, un konkrēts kods vai karodziņš, kas norāda, kā apgriezt attēlu, ir divi cv2.flip metodei nepieciešamie argumenti.

Apvērsta koda vērtība 1 nozīmē, ka mēs pagriezīsim attēlu ap y asi, lai to apgrieztu horizontāli ( 15. rinda ). Ja mēs norādām apvēršanas kodu 0, mēs vēlamies pagriezt attēlu ap x asi ( 19. rinda ). Negatīvs apvēršanas kods ( 23. rinda ) pagriež attēlu pa abām asīm.

Viens no vienkāršākajiem piemēriem šajā tēmā ir attēla apvēršana, kas ir pamata.

Tālāk mēs apspriedīsim attēlu apgriešanu un izmantosim NumPy masīva šķēles, lai iegūtu noteiktas attēla daļas.

5. Attēlu apgriešana

Apgriešana, kā norāda nosaukums, ir interesējošā reģiona (vai vienkārši ROI) izvēles un noņemšanas process, kas ir attēla apgabals, kas mūs interesē.

Seja ir jāapgriež no attēla, lai izmantotu sejas noteikšanas programmu. Turklāt, ja mēs veidojam Python skriptu, lai attēlos atrastu suņus, iespējams, vēlēsities izgriezt suni no attēla, kad mēs to atrodam.

Mērķi: Mūsu galvenais mērķis ir iepazīt un ērti izmantot NumPy masīva sagriešanu, lai apgrieztu attēla apgabalus.

Apgriešana : kad mēs apgriežam attēlu, mūsu mērķis ir novērst tos ārējos elementus, kas mūs neinteresē. IA izvēles process bieži tiek saukts par interesējošā reģiona izvēli.

Izveidojiet jaunu failu ar nosaukumu crop.py , atveriet to un pievienojiet šādu kodu:

# python crop.py

# nepieciešamo pakotņu importēšana

imports cv2

# attēla ielāde un parādīšana ekrānā

attēlu = cv2. nelasīts ( 'vāvere.jpg' )

drukāt ( attēlu. forma )

cv2. imshow ( 'Oriģināls' , attēlu )

# NumPy masīva šķēles tiek izmantotas, lai ātri apgrieztu attēlu

# mēs apgriezīsim vāveres seju no attēla

vāveres seja = attēlu [ 35 : 90 , 35 : 100 ]

cv2. imshow ( 'vāveres seja' , vāveres seja )

cv2. gaidiet taustiņu ( 0 )

# Un tagad mēs apgriezīsim visu ķermeni

# no vāveres

vāveres ķermenis = attēlu [ 35 : 148 , 23 : 143 ]

cv2. imshow ( 'Vāveres ķermenis' , vāveres ķermenis )

cv2. gaidiet taustiņu ( 0 )

Mēs parādīsim apgriešanu programmās Python un OpenCV, izmantojot attēlu, ko mēs ielādējam no diska 5. un 6. rinda .

Oriģinālais attēls, kuru mēs gatavojamies apgriezt

Izmantojot tikai pamata apgriešanas paņēmienus, mēs cenšamies atdalīt vāveres seju un vāveres ķermeni no apkārtējās teritorijas.

Mēs izmantosim savas iepriekšējās zināšanas par attēlu un manuāli piegādāsim NumPy masīva daļas, kur atrodas ķermenis un seja. Normālos apstākļos mēs parasti izmantotu mašīnmācīšanos un datorredzes algoritmus, lai atpazītu seju un ķermeni attēlā. Bet pagaidām darīsim lietas skaidrākas un izvairīsimies no jebkādu noteikšanas modeļu izmantošanas.

Attēlā redzamo seju varam identificēt tikai ar vienu koda rindiņu. 13. rinda , Lai izvilktu attēla taisnstūra daļu, sākot ar (35, 35), mēs piedāvājam NumPy masīva šķēles (90, 100). Var šķist mulsinoši, ka apgriešana tiek ievadīta ar indeksiem augstuma pirmajā un platuma otrajā secībā, taču paturiet prātā, ka OpenCV attēlus saglabā kā NumPy masīvus. Rezultātā mums ir jāiesniedz y ass vērtības pirms x ass.

Lai veiktu apgriešanu, NumPy ir nepieciešami šādi četri indeksi:

Sākt y: Y-koordināta sākumā. Šajā gadījumā mēs sākam ar y=35.

Beigas y: Y koordinātas beigās. Mūsu apgriešana tiks pārtraukta, kad y = 90.

Sākt x: Šķēles sākuma x koordināte. Apgriešana tiek sākta pie x=35.

Beigas x: Šķēles gala x-ass koordināte. Ja x=100, mūsu daļa ir pabeigta.

Līdzīgi mēs apgriežam reģionus (23, 35) un (143, 148) no sākotnējā attēla, lai no attēla izvilktu visu pamattekstu. 19. rinda .

Varat novērot, ka attēls ir apgriezts, lai parādītu tikai ķermeni un seju.

6. Attēla izmēru maiņa

Attēla platuma un augstuma palielināšanas vai samazināšanas process ir pazīstams kā mērogošana vai vienkārši izmēra maiņa. Mainot attēla izmērus, jāņem vērā malu attiecība, kas ir attēla platuma un augstuma attiecība. Malu attiecības neievērošana var radīt attēlus, kas ir mērogoti, un var izskatīties saspiesti un izkropļoti:

Mūsu sākotnējais attēls ir kreisajā pusē. Labajā pusē redzēsiet divus attēlus, kas ir mērogoti, nesaglabājot malu attiecību, tādējādi izkropļojot attēla platuma un augstuma proporciju. Mainot attēlu izmērus, parasti jāņem vērā malu attiecība.

Interpolācijas paņēmienā, ko izmanto mūsu izmēru maiņas algoritms, jāņem vērā arī interpolācijas funkcijas mērķis, lai izmantotu šīs pikseļu apkārtnes, lai palielinātu vai samazinātu attēla izmēru.

Kopumā attēla lieluma samazināšana ir daudz efektīvāka. Tas ir tāpēc, ka pikseļu noņemšana no attēla ir viss, kas jādara interpolācijas funkcijai. No otras puses, ja palielinātu attēla izmēru, interpolācijas metodei būtu 'jāaizpilda atstarpes' starp pikseļiem, kas iepriekš nepastāvēja.

Mums ir mūsu sākotnējais attēls kreisajā pusē. Attēls ir samazināts uz pusi no tā sākotnējā izmēra centrā, taču, izņemot to, attēla 'kvalitāte' nav zaudēta. Tomēr attēla izmērs labajā pusē ir ievērojami palielināts. Tagad tas šķiet “uzspridzināts” un “pikselēts”.

Kā jau teicu iepriekš, jūs parasti vēlaties samazināt attēla izmēru, nevis to palielināt. Samazinot attēla izmēru, mēs analizējam mazāk pikseļu un ir jārisina mazāk “trokšņu”, kas padara attēlu apstrādes algoritmus ātrākus un precīzākus.

Tulkošana un pagriešana ir divas līdz šim aplūkotās attēlu transformācijas. Tagad mēs pārbaudīsim, kā mainīt attēla izmēru.

Nav pārsteidzoši, ka mēs mainīsim attēlu izmērus, izmantojot metodi cv2.resize. Kā jau norādīju iepriekš, izmantojot šo metodi, mums jāņem vērā attēla malu attiecība. Bet, pirms mēs pārāk dziļi iedziļināmies specifikā, ļaujiet man sniegt jums ilustrāciju:

# python resize.py --image squirrel.jpg

# nepieciešamo pakotņu importēšana

imports argparse

imports cv2

# izveidojot argumenta parsētāja objektu un parsējiet argumentu

apObj = argparse. ArgumentParser ( )

apObj. add_argument ( '-k' , '--attēls' , nepieciešams = Taisnība , palīdzēt = 'attēla ceļš' )

argumenti = kuru ( apObj. parse_args ( ) )

# ielādējiet attēlu un parādiet to ekrānā

attēlu = cv2. nelasīts ( argumenti [ 'attēls' ] )

cv2. imshow ( 'Oriģināls' , attēlu )

# Lai attēls neparādītos šķībs, malu attiecība

# ir jāuzskata vai jādeformē; tāpēc mēs izdomājam, ko

# jaunā attēla attiecība pret pašreizējo attēlu.

# Padarīsim mūsu jaunā attēla platumu 160 pikseļi.

aspekts = 160,0 / attēls. forma [ 1 ]

dimensiju = ( 160 , starpt ( attēlu. forma [ 0 ] * aspekts ) )

# šajā rindā tiks parādītas faktiskās izmēru maiņas darbības

mainīts attēla izmērs = cv2. mainīt izmērus ( attēlu , dimensiju , interpolācija = cv2. INTER_AREA )

cv2. imshow ( 'Mainīts attēla platums' , mainīts attēla izmērs )

# Ko darīt, ja mēs vēlētos mainīt attēla augstumu? - izmantojot

# tas pats princips, mēs varam aprēķināt malu attiecību, pamatojoties uz

# par augstumu, nevis platumu. Pagatavosim mērogotu

# attēla augstums 70 pikseļi.

aspekts = 70.0 / attēls. forma [ 0 ]

dimensiju = ( starpt ( attēlu. forma [ 1 ] * aspekts ) , 70 )

# veiciet izmēru maiņu

mainīts attēla izmērs = cv2. mainīt izmērus ( attēlu , dimensiju , interpolācija = cv2. INTER_AREA )

cv2. imshow ( 'Mainīts attēla augstums' , mainīts attēla izmērs )

cv2. gaidiet taustiņu ( 0 )

1.–14. rinda , Pēc pakotņu importēšanas un argumentu parsētāja konfigurēšanas mēs ielādēsim un parādīsim savu attēlu.

20. un 21. rinda: šajās rindās sākas attiecīgais kodējums . Mainot attēla izmērus, ir jāņem vērā attēla malu attiecība. Proporcija starp attēla platumu un augstumu ir zināma kā malu attiecība.

Augstums Platums ir malu attiecība.

Ja mēs neņemsim vērā malu attiecību, izmēru maiņas rezultāti tiks izkropļoti.

Ieslēgts 20. rinda , tiek veikts mainīto izmēru koeficienta aprēķins. Šajā koda rindā mūsu jaunā attēla platums ir 160 pikseļi. Mēs vienkārši definējam mūsu attiecību (aspectratio) kā jauno platumu (160 pikseļi), kas dalīts ar veco platumu, kuram piekļūstam, izmantojot attēlu, lai aprēķinātu jaunā augstuma attiecību pret veco augstumu. forma[1].

Jaunie attēla izmēri ieslēgti 21. rinda var aprēķināt tagad, kad mēs zinām mūsu attiecību. Vēlreiz jaunajam attēlam būs 160 pikseļu platums. Pēc vecā augstuma reizināšanas ar mūsu attiecību un rezultāta pārvēršanas veselā skaitlī tiek aprēķināts augstums. Veicot šo darbību, mēs varam saglabāt attēla sākotnējo malu attiecību.

24. rinda ir vieta, kur attēla lielums patiešām tiek mainīts. Attēls, kuru vēlamies mainīt, ir pirmais arguments, bet otrais ir izmēri, ko aprēķinājām jaunajam attēlam. Mūsu interpolācijas metode, kas ir faktiskā attēla izmēra maiņas algoritms, ir pēdējais parametrs.

Visbeidzot, tālāk 25. rinda , mēs parādām savu mērogoto attēlu.

Mēs no jauna definējam mūsu attiecību (aspectratio) on 31. rinda . Mūsu jaunā attēla augstums būs 70 pikseļi. Mēs dalām 70 ar sākotnējo augstumu, lai iegūtu jauno augstuma un sākotnējā augstuma attiecību.

Tālāk mēs nosakām jaunā attēla izmērus. Jaunā attēla augstums būs 70 pikseļi, kas jau ir zināms. Mēs atkal varam saglabāt attēla sākotnējo malu attiecību, reizinot veco platumu ar attiecību, lai iegūtu jauno platumu.

Pēc tam attēla izmērs faktiski tiek mainīts 35. rinda , un tas tiek parādīts 36. rinda.

Šeit mēs redzam, ka esam samazinājuši sākotnējā attēla platumu un augstumu, vienlaikus saglabājot malu attiecību. Ja malu attiecība netiktu saglabāta, mūsu attēls būtu izkropļots.

Secinājums

Šajā emuārā mēs esam izpētījuši dažādus attēlu apstrādes pamatjēdzienus. Mēs esam redzējuši attēlu tulkošanu ar OpenCV pakotnes palīdzību. Mēs esam redzējuši metodes attēla pārvietošanai uz augšu, uz leju, pa labi un pa kreisi. Šīs metodes ir ļoti noderīgas, veidojot līdzīgu attēlu datu kopu, ko izmantot kā apmācības datu kopu, tāpēc iekārta redzēs dažādus attēlus, pat ja tie ir vienādi. Šis raksts arī mācīja, kā pagriezt attēlu ap jebkuru Dekarta telpas punktu, izmantojot rotācijas matricu. Tad jūs atklājāt, kā OpenCV pagriež attēlus, izmantojot šo matricu, un redzējāt pāris rotējošu attēlu ilustrācijas.

Šajā sadaļā tika apskatītas divas pamata (bet nozīmīgas) attēlu aritmētiskās operācijas saskaitīšanas un atņemšanas. Kā redzat, pamata matricu pievienošana un atņemšana ir visas attēla aritmētiskās darbības.

Turklāt mēs izmantojām OpenCV un NumPy, lai izpētītu attēla aritmētikas īpatnības. Šie ierobežojumi ir jāpatur prātā, pretējā gadījumā, veicot aritmētiskās darbības ar attēliem, jūs riskējat iegūt negaidītus rezultātus.

Ir svarīgi atcerēties, ka, lai gan NumPy veic moduļa darbību un “apgriež”, OpenCV saskaitīšanas un atņemšanas vērtības tiek samazinātas ārpus diapazona [0, 255], lai ietilptu diapazonā. Izstrādājot savas datorredzes lietojumprogrammas, to atcerēšanās palīdzēs izvairīties no sarežģītu kļūdu meklēšanas.

Attēlu apgriešana neapšaubāmi ir viena no vienkāršākajām idejām, ko mēs izpētīsim šajā kursā. Mašīnmācībā bieži tiek izmantota apgriešana, lai ģenerētu vairāk apmācības datu paraugu, tādējādi radot jaudīgākus un uzticamākus attēlu klasifikatorus.

Mēs arī uzzinājām, kā izmantot OpenCV, lai mainītu attēla izmēru. Mainot tā izmēru, ir ļoti svarīgi ņemt vērā gan izmantoto interpolācijas metodi, gan sākotnējā attēla malu attiecību, lai rezultāts netiktu izkropļots.

Visbeidzot, ir svarīgi atcerēties, ka, ja attēla kvalitāte ir problēma, vienmēr vislabāk ir pārslēgties no lielāka attēla uz mazāku. Vairumā gadījumu attēla palielināšana rada artefaktus un pasliktina tā kvalitāti.