- 1. Transformacije slike - Afina in Neafina transformacija
- 2. Prevodi slik - premikanje slike gor, dol, levo in desno
- 3. Vrtenje slike - vrtenje slike
- 4. Skaliranje, spreminjanje velikosti in interpolacija
- 5. Slikovne piramide - še en način spreminjanja velikosti
- 6. Obrezovanje - izrežite želeno območje slike
- 7. Aritmetične operacije za posvetlitev in zatemnitev slik
V prejšnji vadnici smo se naučili o OpenCV in izvedli nekaj osnovnih obdelav slik, ki so jo uporabili, kot so skaliranje sive barve, nasičenost barv, histogram, barvni prostori, RGB komponenta itd. Kot je bilo rečeno v prejšnji vadnici, je OpenCV Open Source Commuter Vision Library, ki C ++, Python in Java vmesniki ter podpira Windows, Linux, Mac OS, iOS in Android. Tako ga je mogoče enostavno namestiti v Raspberry Pi z okoljem Python in Linux. Raspberry Pi z OpenCV in priloženo kamero lahko uporabimo za ustvarjanje številnih aplikacij za obdelavo slik v realnem času, kot so zaznavanje obrazov, zaklepanje obrazov, sledenje predmetom, zaznavanje registrske tablice, sistem za domačo varnost itd.
V tej vadnici bomo videli, kako bomo manipulirali s sliko z uporabo OpenCV. Tu se bomo naučili uporabljati naslednjo funkcijo na sliki z uporabo OpenCV:
- Transformacije slik - Afina in neafinska transformacija
- Prevodi slik - premikanje slike gor, dol, levo in desno
- Sukanje slike - vrtenje slike
- Skaliranje, spreminjanje velikosti in interpolacija
- Slikovne piramide - še en način spreminjanja velikosti
- Obrezovanje - izrežite želeno območje slike
- Aritmetične operacije za posvetlitev in zatemnitev slik
1. Transformacije slike - Afina in Neafina transformacija
Transformacije so geometrijska popačenja, izvedena na sliki, izkrivljanja tu zagotovo ne pomenijo napak, temveč vrsto popravka, da se popravijo perspektivne težave, ki izhajajo iz točke, kjer je bila slika zajeta. Obstajata dve vrsti preoblikovanja slik - Affine in Non-Affine
Afine transformacije imajo tri vrste skaliranja, vrtenja in prevajanja, pri afini transformacijah je pomembno, da so črte vzporedne pred in po transformacijah slik.
Neafine transformacije ali projektivne transformacije ne ohranjajo vzporednosti, dolžine ali kota, vendar ohranjajo kolinearnost in incidenco, kolinearnost pomeni, da obe točki ležita na isti ravni.
Neafinske transformacije so zelo pogoste v računalniškem vidu in nastajajo iz različnih zornih kotov. Neafinske ali projektivne transformacije imenujemo tudi homografija.
2. Prevodi slik - premikanje slike gor, dol, levo in desno
Prevajanje slik premika sliko gor, dol, levo in desno in celo diagonalno, če hkrati izvajamo prevajanje x in y.
Zdaj za izvajanje prevodov slik uporabljamo funkcijo warpAffine opencv , za izvajanje teh prevodov se uporablja cv2.warpAffine, vendar za to potrebujemo matriko prevodov.
Matrika prevajanja, T = 1 0 Tx
0 1 ty
T X, T y so smeri, v katerih se premika slika.
Pri čemer je T X premik vzdolž osi X (vodoravno)
T Y je premik vzdolž osi Y (navpično)
# to je afinna transformacija, ki preprosto premakne položaj slike # za izvajanje teh transformacij uporabljamo cv2.warpAffine. import cv2 import numpy as np image = cv2.imread ('input.jpg') # shrani višino in širino višine slike , width = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (slika, T, (širina, višina)) print (T) cv2.imshow ('original_image', slika) cv2.waitKey (0) cv2.imshow (' Prevod ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Izhod konzole - (183, 275) - višina in širina
- T matrika
]
3. Vrtenje slike - vrtenje slike
Vrtenje slike je vrtenje slike okoli točke ali točke v središču slike, tako kot vrtljiva točka deluje kot vrtišče.
Ker imamo v prevodu matrico T, verjetno imamo v rotaciji matriko M
Matrica vrtenja, matrica M = Cosθ-Sinin
Sinθ Cosθ
Kjer je θ kot vrtenja, izmerjen v nasprotni smeri urnega kazalca.
Upoštevati je treba tudi to, da vam OpenCV omogoča prodajo in sukanje slike hkrati s funkcijo cv2.getRotationMatrix2D (rotacija_center_x, rotacija_center_y, kot zasuka, lestvica)
Za vrtenje slike še vedno uporabljamo funkcijo warpAffine opencv, vendar namesto matrice prevajanja, kot v prejšnjem primeru, uporabljamo matriko vrtenja.
import cv2 import numpy kot np image = cv2.imread ('input.jpg') višina, širina = image.shape #razdelite višino in širino za 2, da zasukate sliko okoli njenega središča_hosting_matrix = cv2.getRotationMatrix2D ((width / 2, višina / 2), 90,1) rotated_image = cv2.warpAffine (slika, matrica_ rotacije, (širina, višina)) cv2.imshow ('originalna slika', slika) cv2.waitKey (0) cv2.imshow ('obrnjena slika ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Zdaj je slika zasukana za 90 stopinj in je obrezana zaradi velikosti platna, saj velikost platna ostaja enaka, vendar se zaradi vrtenja velikost slike ne prilega velikosti platna. Lahko ga prilagodite tako, da nastavite faktor skaliranja na negativno, vendar omogoča črno ozadje za sliko.
Torej lahko nastavite višino in širino slike tako, da jo predvidite ali uganete, ali obstaja drug način vrtenja slike, tako da jo prenesete, vendar bi sliko zavrteli za večkratnike 90 stopinj v nasprotni smeri urnega kazalca.
4. Skaliranje, spreminjanje velikosti in interpolacija
Spreminjanje velikosti in spreminjanje velikosti sta afinirani transformaciji, spreminjanje velikosti slike je tisto, kar smo naredili že kar nekaj časa, ukvarjali pa smo se tudi z interpolacijo, tako kot pri spreminjanju velikosti slike na večjo velikost, v kateri širimo slikovne pike, je nekaj vrzeli v slikovnih pik in tu pride do interpolacije.
Pojavi se lahko pri povečanju velikosti slike z manjše na večjo ali zmanjšanju velikosti slike z večje na manjšo.
Tehnično je interpolacija metoda za ustvarjanje novih podatkovnih točk (pikslov) znotraj diskretnega nabora znanih podatkovnih točk.
V OpenCV obstajajo različne vrste interpolacijskih metod
cv2.INTER_AREA - primeren za krčenje ali vzorčenje navzdol
cv2.INTER_NEAREST - najhitrejši
cv2.LINEAR - dobro za povečavo ali vzorčenje navzgor (privzeto)
cv2.CUBIC - boljši
cv2.INTER_LANCZOS4 - najboljši
# spreminjanje velikosti je zelo enostavno s funkcijo cv2.resize, njeni argumenti so # cv2.resize (slika, dsize (velikost izhodne slike), x_scale, y_scale, interpolacija) import cv2 import numpy as np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # naredimo sliko 3/4 izvirne velikosti slike, tj. pomanjšamo na 75% image_scaled = cv2.resize (slika, None, fx = 0,75, fy = 0,75) # ker je linearna interpolacija privzeta metoda za odprti cv, nam je ni treba izvajati kot funkcijo. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # podvojimo velikost naše slike img_double = cv2.resize (slika, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ("scaing_cubicInterpolation ', img_double) cv2.waitKey (0) # naredimo preoblikovanje velikosti z točne mere image_resize = cv2.resize (sliko (200,300), interpolacija = cv2.INTER_AREA) cv2.imshow (" scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Slikovne piramide - še en način spreminjanja velikosti
Slika s piramido se nanaša na povečanje slike (povečanje slik) ali zmanjšanje slike (krčenje slik).
To je preprosto drugačen način spreminjanja velikosti, ki nam omogoča enostavno in hitro spreminjanje slik, pri čemer pomanjšamo zmanjšanje višine in širine nove slike za polovico.
To je koristno pri izdelavi detektorjev predmetov, ki slike prilagajajo vsakič, ko iščejo predmet.
uvoz cv2 slika = cv2.imread ('input.jpg') manjša = cv2.pyrDown (slika) večja = cv2.pyrUp (manjša) cv2.imshow ('original', slika) cv2.waitKey (0) cv2.imshow ('manjši', manjši) cv2.waitKey (0) cv2.imshow ('večji', večji) cv2.waitKey (0) cv2.destroyAllWindows ()
Pri večji sliki boste opazili, da je enaka velikost prvotne slike malo zamegljena, ker jo neposredno pretvorite iz manjše v večjo. Če pa jo interpoliramo, se kakovost slike izboljša kot prejšnja, ker interpolacija oceni piksle med polnjenjem presledkov, ko je slika povečana.
Zdaj izvajanje iste kode, vendar s kubično interpolacijo, daje boljšo kakovost velike slike. Pod slikami je prikazana primerjava med izvirno sliko, povečano različico slike, manjšo sliko in kubično interpolirano različico manjše slike.
uvoz cv2 slika = cv2.imread ('input.jpg') manjša = cv2.pyrDown (slika) večja = cv2.pyrUp (manjša) cv2.imshow ('original', slika) cv2.waitKey (0) cv2.imshow ('manjši', manjši) cv2.waitKey (0) cv2.imshow ('večji', večji) cv2.waitKey (0) # povečanje kakovosti pretvorjene večje slike iz manjše slike s pomočjo kubične interpolacije img_double = cv2.resize (manjša, Brez, fx = 2, fy = 2, interpolacija = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
OPOMBA: Če želite ustvariti več majhnih kopij slik, ki so manjših in manjših, ali več velikih kopij slik, ki se nenehno povečujejo, jih lahko uporabimo za zanke ali medtem, ko zanke ostanejo znotraj funkcije pyrDown ali pyrUp .
6. Obrezovanje - izrežite želeno območje slike
Obrezovanje slik se nanaša na izvleček segmenta slike.
OpenCV neposredno nima funkcije obrezovanja, vendar jo lahko enostavno izvede numpy z uporabo spodnje kode
Obrezano = slika
Polje slike postavimo in z orodji za indeksiranje v numpy določimo začetno vrstico do končne vrstice in začetni stolpec do končnega stolpca, ločene z vejico, ki izvleče pravokotnik, ki ga želimo obrezati, da dobimo sliko.
import cv2 import numpy kot np image = cv2.imread ('input.jpg') višina, širina = image.shape # dobimo začetne koordinate slikovnih pik (zgoraj levo od obrezovalnega pravokotnika) start_row, start_col = int (višina *.25), int (širina *.25) # dobimo končne koordinate pikslov (spodaj desno) end_row, end_col = int (višina *.75), int (širina *.75) # preprosto uporabite indeksiranje, da izrežete pravokotnik, ki ga želimo obrezati = slika cv2.imshow ("izvirna slika", slika) cv2.waitKey (0) cv2.imshow ("obrezana slika", obrezana) cv2.waitKey (0) cv2.destroyAllWindows ()
Upoštevajte, da lahko vrednosti pikslov uporabite neposredno namesto start_col ali start_row , le dane so za enostavno identifikacijo uporabnika.
7. Aritmetične operacije za posvetlitev in zatemnitev slik
Aritmetične operacije v OpenCV v bistvu pomenijo dodajanje ali odštevanje matric na sliki, dodajanje ali odštevanje matric pa vpliva na povečanje ali zmanjšanje svetlosti.
Torej, če želimo dodati ali odšteti matrike, jih moramo ustvariti, numpy pa ima funkcijo, imenovano np.ones, ki daje matrike enake velikosti 1 kot naša slika.
import cv2 import numpy as np image = cv2.imread ('input.jpg') # ustvari matriko svojega, nato pa jo pomnoži s skalerjem 100 ' # np.ones daje matriko z enako dimenzijo kot naša slika z vsemi vrednosti so 100 v tem primeru M = np.ones (image.shape, dtype = "uint8") * 100 # to uporabimo za dodajanje te matrike M na našo sliko # opazimo povečanje svetlosti dodano = cv2.add (slika, M) cv2.imshow ("Dodano", dodano) cv2.waitKey (0) # prav tako lahko odštejemo # opazimo zmanjšanje svetlosti odšteto = cv2.subtract (slika, M) cv2.imshow ("odšteto", odšteto) cv2.waitKey (0) cv2.destroyAllWindows ()
Tako lahko OpenCV uporabite za uporabo številnih različnih postopkov obdelave slik na sliki. V nadaljevanju bomo nadaljevali z drugimi funkcijami za obdelavo slik.