- 1. Transformacije slike - Afina i Neafinska transformacija
- 2. Prijevodi slika - Pomicanje slike gore, dolje, lijevo i desno
- 3. Rotacija slike - okretanje slike
- 4. Skaliranje, promjena veličine i interpolacija
- 5. Slikovne piramide - Drugi način promjene veličine
- 6. Obrezivanje - izrezivanje željenog područja slike
- 7. Aritmetičke operacije za posvjetljivanje i zamračivanje slika
U prethodnom uputstvu naučili smo o OpenCV-u i izvršili neke osnovne obrade slika koristeći ga poput skaliranja sive boje, zasićenosti boja, histograma, prostora boja, RGB komponente itd. Kao što je rečeno u prethodnom vodiču, OpenCV je Open Source Commuter Vision Library koja ima C ++, Python i Java sučelja i podržava Windows, Linux, Mac OS, iOS i Android. Tako se može lako instalirati u Raspberry Pi s Pythonom i Linux okruženjem. A Raspberry Pi s OpenCV-om i priključenom kamerom može se koristiti za stvaranje mnogih aplikacija za obradu slika u stvarnom vremenu poput otkrivanja lica, zaključavanja lica, praćenja predmeta, otkrivanja pločica automobila, kućnog sigurnosnog sustava itd.
U ovom uputstvu vidjet ćemo kako ćemo manipulirati slikom pomoću OpenCV-a. Ovdje ćemo naučiti primijeniti sljedeću funkciju na sliku pomoću OpenCV-a:
- Transformacije slike - Afina i neafinska transformacija
- Prijevodi slika - pomicanje slike gore, dolje, lijevo i desno
- Rotacija slike - okretanje slike
- Skaliranje, promjena veličine i interpolacija
- Slikovne piramide - Drugi način promjene veličine
- Obrezivanje - izrezivanje željenog područja slike
- Aritmetičke operacije za posvjetljivanje i zamračivanje slika
1. Transformacije slike - Afina i Neafinska transformacija
Transformacije su geometrijska izobličenja koja se provode na slici, a izobličenja ovdje sigurno ne znače pogreške, već vrstu korekcije kako bi se ispravili problemi s perspektivom koji proizlaze iz točke snimanja slike. Postoje dvije vrste transformacije slike - Affine i Non-Affine
Afine transformacije su tri vrste skaliranja, rotacije i translacije, najvažnija stvar u afinskim transformacijama je da su linije paralelne prije i nakon transformacije slike.



Neafinne transformacije ili projektivne transformacije ne čuvaju paralelizam, duljinu ili kut, ali ipak čuvaju kolinearnost i incidenciju, kolinearnost znači da dvije točke leže na istoj pravoj liniji.
Neafinne transformacije vrlo su česte u računalnom vidu i generiraju se iz različitih kutova kamere. Neafinne ili projektivne transformacije nazivaju se i homografijom.

2. Prijevodi slika - Pomicanje slike gore, dolje, lijevo i desno
Prijevod slike pomiče sliku gore, dolje, lijevo i desno, pa čak i dijagonalno ako istodobno implementiramo x i y prijevod.
Sada za izvođenje prijevoda slika koristimo opencv-ovu funkciju warpAffine, cv2.warpAffine koristi se za implementaciju tih prijevoda, ali za to nam je potrebna matrica prijevoda.
Matrica prijevoda, T = 1 0 Tx
0 1 ty
T X, T y su smjerovi u kojima se odvija pomicanje slike.
Pri čemu je T X pomak duž osi X (vodoravno)
T Y je pomak duž Y osi (vertikalno)
# ovo je afina transformacija koja jednostavno pomiče položaj slike # koristimo cv2.warpAffine za provedbu ovih transformacija. import cv2 import numpy as np image = cv2.imread ('input.jpg') # spremi visinu i širinu visine 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, visina)) print (T) cv2.imshow ('original_image', slika) cv2.waitKey (0) cv2.imshow (' Prijevod ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()

Izlaz konzole - (183, 275) - visina i širina
- T matrica
]
3. Rotacija slike - okretanje slike
Rotacija slike je okretanje slike oko točke ili točke u središtu slike, baš kao što rotacijska točka djeluje poput stožera.
Kako u prijevodu imamo T matricu, vjerojatno u rotaciji imamo M matricu
Matrica rotacije, M matrica = Cosθ -Sinθ
Sinθ Cosθ
Gdje je θ kut rotacije, izmjeren u smjeru suprotnom od kazaljke na satu.
Također moramo napomenuti da vam OpenCV omogućuje prodaju i rotiranje slike istovremeno koristeći funkciju cv2.getRotationMatrix2D (rotacija_centar_x, rotacija_centar_y, kut rotacije, mjerilo)
Još uvijek koristimo opencv-ovu funkciju warpAffine da bismo dobili rotaciju slike, ali umjesto matrice za prijevod kao u prethodnom slučaju ovdje koristimo matricu rotacije.
import cv2 import numpy kao np image = cv2.imread ('input.jpg') visina, širina = image.shape #podijelite visinu i širinu za 2 da biste zarotirali sliku oko njenog centra rotacija_matrix = cv2.getRotationMatrix2D ((width / 2, visina / 2), 90,1) rotated_image = cv2.warpAffine (slika, rotacija_matrica, (širina, visina)) cv2.imshow ('izvorna slika', slika) cv2.waitKey (0) cv2.imshow ('rotirana slika ', rotirana_slika) cv2.waitKey (0) cv2.destroyAllWindows ()

Sada je slika rotirana za 90 stupnjeva, obrezana je zbog veličine platna, jer veličina platna ostaje ista, ali zbog rotacije veličina slike ne odgovara veličini platna. Može se podesiti tako da se faktor skaliranja postavi na negativan, ali omogućuje crnu pozadinu iza slike.
Dakle, možete postaviti visinu i širinu slike tako što ćete je predvidjeti ili pogoditi, ili postoji druga metoda okretanja slike transponiranjem, ali ona bi rotirala sliku za višekratnike od 90 stupnjeva u smjeru suprotnom od kazaljke na satu.

4. Skaliranje, promjena veličine i interpolacija
Skaliranje i promjena veličine su afine transformacije, promjena veličine slike ono je što smo radili dosta vremena, a bavili smo se i interpolacijom, kao kad mijenjate veličinu slike u veću veličinu u kojoj širimo piksele, postoje neke praznine u piksela i tu dolazi do interpolacije.
Može se dogoditi kod povećanja veličine slike s manje na veću ili smanjenja veličine s veće na manju.
Tehnički, interpolacija je metoda konstrukcije novih podatkovnih točaka (piksela), unutar diskretnog skupa poznatih podatkovnih točaka.
Postoje razne vrste metoda interpolacije u OpenCV-u
cv2.INTER_AREA - dobro za skupljanje ili uzorkovanje prema dolje
cv2.INTER_NEAREST - najbrži
cv2.LINEAR - dobro za zumiranje ili uzorkovanje prema gore (zadano)
cv2.CUBIC - bolje
cv2.INTER_LANCZOS4 - najbolje
# promjena veličine je vrlo jednostavna pomoću funkcije cv2.resize, argumenti su joj: # cv2.resize (slika, dsize (veličina izlazne slike), x_scale, y_scale, interpolacija) import cv2 import numpy kao np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', slika) cv2.waitKey (0) # učinimo sliku 3/4 izvornom veličinom slike, tj. smanjimo na 75% image_scaled = cv2.resize (slika, None, fx = 0,75, fy = 0,75) # budući da je linearna interpolacija zadana metoda za otvoreni cv, ne trebamo je implementirati kao funkciju. cv2.imshow ('skalirajuća_linearna interpolacija', image_scaled) cv2.waitKey (0) # udvostručimo veličinu 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) # napravimo promjenu veličine tačnim dimenzijama image_resize = cv2.resize (slika, (200.300), interpolacija = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()



5. Slikovne piramide - Drugi način promjene veličine
Slika s piramidom odnosi se na povećanje (povećavanje slika) ili smanjenje (smanjenje slika).
To je jednostavno drugačiji način promjene veličine koji nam omogućuje jednostavno i brzo skaliranje slika, smanjujući smanjenje polovine visine i širine nove slike.
Ovo je korisno kod izrade detektora predmeta koji skaliraju slike svaki put kad traži neki objekt.
uvoz cv2 slika = cv2.imread ('input.jpg') manji = cv2.pyrDown (slika) veći = cv2.pyrUp (manji) cv2.imshow ('original', slika) cv2.waitKey (0) cv2.imshow ('manji', manji) cv2.waitKey (0) cv2.imshow ('veći', veći) cv2.waitKey (0) cv2.destroyAllWindows ()


Na većoj slici primijetit ćete da je i dalje iste veličine izvorne slike malo zamućeno jer se izravno pretvara iz manje slike u veću. Ali ako je interpoliramo, kvaliteta slike poboljšava se kao i prethodna, jer interpolacija procjenjuje piksele dok popunjava razmake kada je slika povećana.
Sada izvođenje istog koda, ali s kubnom interpolacijom, daje bolju kvalitetu velike slike. Ispod slika prikazana je usporedba izvorne slike, uvećane verzije slike, manje slike i kubne interpolirane verzije manje slike.
uvoz cv2 slika = cv2.imread ('input.jpg') manji = cv2.pyrDown (slika) veći = cv2.pyrUp (manji) cv2.imshow ('original', slika) cv2.waitKey (0) cv2.imshow ('manji', manji) cv2.waitKey (0) cv2.imshow ('veći', veći) cv2.waitKey (0) # povećanje kvalitete pretvorene veće slike iz manje slike pomoću kubne interpolacije img_double = cv2.resize (manji, Ništa, fx = 2, fy = 2, interpolacija = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()


NAPOMENA: Ako želite stvoriti više malih kopija slika koje postaju sve manje i manje ili više velikih kopija slika koje neprestano rastu, tada možemo koristiti za petlje ili dok se petlje zadržavaju unutar funkcije pyrDown ili pyrUp .
6. Obrezivanje - izrezivanje željenog područja slike
Obrezivanje slika odnosi se na izdvajanje segmenta slike.
OpenCV izravno nema funkciju obrezivanja, ali to se lako može učiniti numpy-om pomoću donjeg koda
Obrezano = slika

Polje slike stavljamo i pomoću alata za indeksiranje ili metode u numpy definiramo početni redak do krajnjeg retka i početni stupac do krajnjeg stupca odvojeni zarezom koji vadi pravokutnik koji želimo obrezati da bismo dobili sliku.
import cv2 import numpy kao np image = cv2.imread ('input.jpg') visina, širina = image.shape # uzmimo koordinate početnog piksela (gore lijevo od pravokutnika za obrezivanje) start_row, start_col = int (visina *.25), int (širina *.25) # uzmimo završne koordinate piksela (dolje desno) end_row, end_col = int (visina *.75), int (širina *.75) # jednostavno upotrijebite indeksiranje za izrezivanje pravokutnika koji želimo obrezati = slika cv2.imshow ("izvorna slika", slika) cv2.waitKey (0) cv2.imshow ("izrezana slika", obrezana) cv2.waitKey (0) cv2.destroyAllWindows ()

Imajte na umu da vrijednosti piksela možete koristiti izravno umjesto start_col ili start_row , one su samo dane za jednostavnu identifikaciju korisnika.
7. Aritmetičke operacije za posvjetljivanje i zamračivanje slika
Aritmetičke operacije u OpenCV-u u osnovi su dodavanje ili oduzimanje matrica na slici, dodavanje ili oduzimanje matrica utječe na povećanje ili smanjenje svjetline.
Dakle, da bismo dodali ili oduzeli matrice, moramo ih stvoriti, a numpy ima funkciju koja se naziva np.ones koja daje matrice jednake veličine kao i naša slika.
import cv2 import numpy as np image = cv2.imread ('input.jpg') # kreirajte nečiju matricu , a zatim je pomnožite sa skalom od 100 ' # np.ones daje matricu iste dimenzije kao i naša slika sa svim vrijednosti su u ovom slučaju 100 M = np.ones (image.shape, dtype = "uint8") * 100 # koristimo ovo za dodavanje ove matrice M na našu sliku # primijetite porast svjetline added = cv2.add (slika, M) cv2.imshow ("Dodano", dodano) cv2.waitKey (0) # jednako tako možemo i oduzeti # primijetiti smanjenje svjetline oduzeti = cv2.subtract (slika, M) cv2.imshow ("oduzeti", oduzeti) cv2.waitKey (0) cv2.destroyAllWindows ()
Na ovaj se način OpenCV može koristiti za primjenu mnogih različitih operacija obrade slika na slici. Nastavit ćemo s ostalim funkcijama manipulacije slikama u sljedećem vodiču.
