- 1. Attēlu transformācijas - afīnu un citu cilvēku pārveidošana
- 2. Attēlu tulkojumi - kustīgs attēls uz augšu, uz leju, pa kreisi un pa labi
- 3. Attēla pagriešana - attēla vērpšana
- 4. Mērogošana, izmēru maiņa un interpolācija
- 5. Attēlu piramīdas - vēl viens izmēru maiņas veids
- 6. Apgriešana - vajadzīgā attēla reģiona izgriešana
- 7. Aritmētiskās darbības attēlu spilgtināšanai un aptumšošanai
Iepriekšējā apmācība, mēs esam iemācījušies par OpenCV un izdarīt dažus pamata attēlu apstrāde, izmantojot to kā pelēkā mērogošanas, krāsu piesātinājums, histogramma, krāsu telpas, RGB komponentu uc Kā pastāstīja iepriekšējā apmācība, OpenCV ir Open Source Piepilsētas Vision bibliotēkas, kas ir C ++, Python un Java saskarnes un atbalsta Windows, Linux, Mac OS, iOS un Android. Tātad to var viegli instalēt Raspberry Pi ar Python un Linux vidi. Un Raspberry Pi ar OpenCV un pievienoto kameru var izmantot, lai izveidotu daudzas reāllaika attēlu apstrādes programmas, piemēram, sejas noteikšanu, sejas bloķēšanu, objektu izsekošanu, automašīnas numura zīmes noteikšanu, mājas drošības sistēmu utt.
Šajā apmācībā mēs redzēsim, kā mēs manipulēsim ar attēlu, izmantojot OpenCV. Šeit mēs iemācīsimies attēlam izmantot šādu funkciju, izmantojot OpenCV:
- Attēlu transformācijas - afīnu un citu cilvēku pārveidošana
- Attēlu tulkojumi - kustīgs attēls uz augšu, uz leju, pa kreisi un pa labi
- Attēla pagriešana - attēla vērpšana
- Mērogošana, lieluma maiņa un interpolācija
- Attēlu piramīdas - vēl viens veids, kā mainīt izmērus
- Apgriešana - vajadzīgā attēla reģiona izgriešana
- Aritmētiskās darbības attēlu spilgtināšanai un aptumšošanai
1. Attēlu transformācijas - afīnu un citu cilvēku pārveidošana
Transformācijas ir ģeometriski deformācijas, kas tiek izdarītas uz attēlu, un šeit noteikti traucējumi nenozīmē kļūdas, bet gan korekcijas veidu, lai novērstu perspektīvas problēmas, kas rodas no attēla uzņemšanas vietas. Ir divi attēla pārveidošanas veidi - Affine un Non-Affine
Afīnu transformācijām ir trīs veidu mērogošana, pagriešana un tulkošana, afīnu transformācijās ir svarīgi, lai līnijas būtu paralēlas pirms un pēc attēla transformācijām.
Transformācijas, kas nav saistītas ar afīnu, vai projektīvas transformācijas nesaglabā paralēlismu, garumu vai leņķi, tomēr saglabā kolinearitāti un biežumu, kolinearitāte nozīmē, ka abi punkti atrodas vienā un tajā pašā taisnā līnijā.
Transformācijas, kas nav saistītas ar afīnu, ir ļoti izplatītas datora redzējumā un tiek ģenerētas no dažādiem kameras leņķiem. Nefīniskas vai projektīvas transformācijas sauc arī par homogrāfiju.
2. Attēlu tulkojumi - kustīgs attēls uz augšu, uz leju, pa kreisi un pa labi
Attēla tulkošana pārvieto attēlu uz augšu, uz leju, pa kreisi un pa labi un pat pa diagonāli, ja vienlaikus īstenojam x un y tulkošanu.
Tagad attēlu tulkojumu veikšanai mēs izmantojam opencv funkciju warpAffine, šo tulkojumu ieviešanai tiek izmantota cv2.warpAffine, taču tam mums ir nepieciešama tulkošanas matrica.
Tulkošanas matrica, T = 1 0 Tx
0 1 ty
T X, T y ir virzieni, kuros notiek attēla nobīde.
Kur T X ir nobīde pa X asi (horizontāli)
T Y ir nobīde pa Y asi (vertikāli)
# šī ir afinēta transformācija, kas vienkārši maina attēla pozīciju # mēs izmantojam cv2.warpAffine, lai ieviestu šīs transformācijas. importēt cv2 importēt numpy kā np image = cv2.imread ('input.jpg') # glabāt attēla augstuma augstumu un platumu , width = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (attēls, T, (platums, augstums)) druka (T) cv2.imshow ('oriģināls_attēls', attēls) cv2.waitKey (0) cv2.imshow (' Tulkošana ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Konsoles izeja - (183, 275) - augstums un platums
- T matrica
]
3. Attēla pagriešana - attēla vērpšana
Attēla pagriešana ir attēla pagriešana ap punktu vai punktu attēla centrā, tāpat kā pagriešanas punkts darbojas kā pagrieziena punkts.
Tāpat kā tulkojumā, mums ir T matrica, iespējams, ka rotācijā mums ir M matrica
Rotācijas matrica, M matrica = Cosθ -Sinθ
Sinθ Cosθ
Kur θ ir rotācijas leņķis, mērot pretēji pulksteņrādītāja kustības virzienam.
Jāatzīmē arī viena lieta, ka OpenCV ļauj vienlaikus pārdot un pagriezt attēlu, izmantojot funkciju cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, rotation angle, scale)
Mēs joprojām izmantojam opencv's warpAffine funkciju, lai iegūtu attēla pagriešanu, bet tulkošanas matricas vietā, tāpat kā iepriekšējā gadījumā, šeit mēs izmantojam rotācijas matricu.
importēt cv2 importēt numpy kā np image = cv2.imread ('input.jpg') augstums, platums = image.shape # sadaliet augstumu un platumu par 2, lai pagrieztu attēlu ap tā centrā rotation_matrix = cv2.getRotationMatrix2D ((width / 2, height / 2), 90,1) rotated_image = cv2.warpAffine (attēls, rotācijas matrica, (platums, augstums)) cv2.imshow ('sākotnējais attēls', attēls) cv2.waitKey (0) cv2.imshow ('pagriezts attēls ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Tagad attēls ir pagriezts par 90 grādiem, tas ir apgriezts audekla izmēra dēļ, jo audekla izmērs paliek nemainīgs, bet rotācijas dēļ attēla lielums neietilpst audekla izmērā. To varētu pielāgot, iestatot mērogošanas koeficientu uz negatīvu, taču tas aiz attēla ļauj melnu fonu.
Tātad jūs varat iestatīt attēla augstumu un platumu, to paredzot vai nojaušot, vai ir cita attēla pagriešanas metode, to transponējot, taču tas pagrieztu attēlu par 90 grādu reizinājumiem pretēji pulksteņrādītāja kustības virzienam.
4. Mērogošana, izmēru maiņa un interpolācija
Mērogošana un izmēru maiņa ir afinālas transformācijas, attēla lieluma maiņa ir tas, ko mēs esam darījuši diezgan ilgu laiku, un mēs esam tikuši galā arī ar interpolāciju, piemēram, kad jūs maināt attēla izmēru uz lielāku izmēru, kurā mēs paplašinām pikseļus, ir dažas nepilnības. pikseļi, un tur notiek interpolācija.
Tas var notikt, palielinot attēla izmēru no mazāka uz lielāku vai samazinot attēla izmēru no lielāka uz mazāku.
Tehniski interpolācija ir metode jaunu datu punktu (pikseļu) konstruēšanai zināmu datu punktu diskrētā kopumā.
Ir dažādi interpolācijas metožu veidi, piemēram, OpenCV
cv2.INTER_AREA - labs paraugu samazināšanai vai samazināšanai
cv2.INTER_NEAREST - ātrākais
cv2.LINEAR - labs, lai tuvinātu vai palielinātu izlasi (noklusējums)
cv2.CUBIC - labāks
cv2.INTER_LANCZOS4 - labākais
# izmēru maiņa ir ļoti vienkārša, izmantojot funkciju cv2.resize, tās argumenti ir # cv2.resize (attēls, izmērs (izvades attēla izmērs), x_scale, y_scale, interpolācija) importēt cv2 import numpy kā np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', attēls) cv2.waitKey (0) # izveidosim attēlu 3/4 no sākotnējā attēla lieluma, ti, samazināsim līdz 75% image_scaled = cv2.resize (image, None, fx = 0,75, fy = 0,75) # tā kā lineārā interpolācija ir noklusējuma metode atvērtai cv, mums tā nav jāievieš kā funkcija. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # dubultosim attēla izmēru img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # veiksim izmēru maiņu pēc precīziem izmēriem image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Attēlu piramīdas - vēl viens izmēru maiņas veids
Piramidējošais attēls attiecas uz palielināšanu (attēlu palielināšana) vai samazināšanu (attēlu samazināšana).
Tas vienkārši ir atšķirīgs izmēru maiņas veids, kas ļauj mums viegli un ātri mērogot attēlus, samazinot uz leju, uz pusi samazinot jaunā attēla augstumu un platumu.
Tas ir noderīgi, veidojot objektu detektorus, kas mērogo attēlus katru reizi, kad tas meklē objektu.
importēt cv2 attēlu = cv2.imread ('input.jpg') mazāks = cv2.pyrDown (attēls) lielāks = cv2.pyrUp (mazāks) cv2.imshow ('oriģināls', attēls) cv2.waitKey (0) cv2.imshow ('mazāks', mazāks) cv2.waitKey (0) cv2.imshow ('lielāks', lielāks) cv2.waitKey (0) cv2.destroyAllWindows ()
Lielākā attēlā jūs pamanīsit, ka sākotnējā attēla izmērs joprojām ir mazs izplūdis, jo tas tiek tieši pārveidots no mazāka attēla uz lielāku. Bet, ja mēs to interpolējam, attēla kvalitāte uzlabojas salīdzinājumā ar iepriekšējo, jo interpolācija novērtē pikseļus, aizpildot atstarpes, kad attēls tiek palielināts.
Tagad, palaižot to pašu kodu, bet ar kubveida interpolāciju, tiek nodrošināta labāka liela attēla kvalitāte. Zemāk redzamie attēli parāda salīdzinājumu starp sākotnējo attēlu, palielinātu attēla versiju, mazāku attēlu un mazāka attēla kubiskā interpolēto versiju.
importēt cv2 attēlu = cv2.imread ('input.jpg') mazāks = cv2.pyrDown (attēls) lielāks = cv2.pyrUp (mazāks) cv2.imshow ('oriģināls', attēls) cv2.waitKey (0) cv2.imshow ('mazāks', mazāks) cv2.waitKey (0) cv2.imshow ('lielāks', lielāks) cv2.waitKey (0) # konvertēta lielāka attēla kvalitātes uzlabošana no mazāka attēla, izmantojot kubisko interpolāciju img_double = cv2.resize (mazāks, Neviens, fx = 2, fy = 2, interpolācija = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
Piezīme: Ja jūs vēlaties, lai izveidotu vairākas mazas kopijas attēlu iet mazāks un mazāka izmēra vai vairāku lielu kopijas attēlu nepārtraukti aug izmēra, tad mēs varam izmantot , lai cilpu vai kamēr cilpas saglabājot iekšā pyrDown vai pyrUp funkciju.
6. Apgriešana - vajadzīgā attēla reģiona izgriešana
Attēlu apgriešana attiecas uz attēla segmenta iegūšanu.
OpenCV tieši nav apgriešanas funkcijas, taču to var viegli izdarīt, izmantojot numpy, izmantojot zemāk redzamo kodu
Apgriezts = attēls
Mēs ievietojam attēlu masīvu un, izmantojot indeksēšanas rīkus vai metodi numpy, mēs definējam sākuma rindu līdz gala rindai un sākuma kolonnu līdz galam kolonnu, atdalot tos ar komatu, kas izvelk taisnstūri, kuru vēlamies apgriezt, lai iegūtu attēlu.
importēt cv2 importēt numuru kā np image = cv2.imread ('input.jpg') augstums, platums = image.shape # iegūstam sākuma pikseļu koordinātas (taisnstūra apgriešanas augšējā kreisajā pusē) start_row, start_col = int (augstums *.25), int (platums *.25) # pieņemsim beigu pikseļu koordinātas (apakšējā labajā stūrī) end_row, end_col = int (augstums *.75), int (platums *.75) # vienkārši izmantojiet indeksēšanu, lai izgrieztu vēlamo taisnstūri, kuru mēs gribam apgriezt = attēls cv2.imshow ("sākotnējais attēls", attēls) cv2.waitKey (0) cv2.imshow ("apgriezts attēls", apgriezts) cv2.waitKey (0) cv2.destroyAllWindows ()
Ņemiet vērā, ka pikseļu vērtības varat izmantot tieši sākuma_kolas vai sākuma_rindas vietā , tās ir tikai norādītas, lai lietotājam būtu viegli identificējama.
7. Aritmētiskās darbības attēlu spilgtināšanai un aptumšošanai
Aritmētiskās darbības OpenCV pamatā ir matricu pievienošana vai atņemšana attēlam, matricu pievienošana vai atņemšana ietekmē spilgtuma palielināšanos vai samazināšanos.
Tātad, lai pievienotu vai atņemtu matricas, mums tās ir jāizveido, un numpy ir funkcija, ko sauc par np.ones, kas dod matricas, kuru lielums ir tāds pats kā mūsu attēlā.
importēt cv2 importēt numpy kā np image = cv2.imread ('input.jpg') #izveidot matricu, pēc tam reizināt ar mērogotāju 100 ' # np.ones dod matricu ar tādu pašu izmēru kā mūsu attēlam ar visiem vērtības ir 100 šajā gadījumā M = np.ones (image.shape, dtype = "uint8") * 100 # mēs to izmantojam, lai pievienotu šo matricu M mūsu attēlam #pievērojiet pievienotā spilgtuma pieaugumu = cv2.add (attēls, M) cv2.imshow ("Pievienots", pievienots) cv2.waitKey (0) # tāpat mēs varam arī atņemt #pamanīt atņemtā spilgtuma samazināšanos = cv2.sumtract (attēls, M) cv2.imshow ("atņemts", atņemts) cv2.waitKey (0) cv2.destroyAllWindows ()
Tas ir veids, kā OpenCV var izmantot, lai attēlam piemērotu daudzas dažādas attēlu apstrādes darbības. Nākamajā apmācībā mēs turpināsim izmantot citas attēla manipulācijas funkcijas.