- 1. Kuvan muunnokset - affinien ja muiden kuin afiinien muunnokset
- 2. Kuvan käännökset - Liikkuva kuva ylös, alas, vasemmalle ja oikealle
- 3. Kuvan kierto - Kuvan pyöriminen
- 4. Skaalaus, koon muuttaminen ja interpolointi
- 5. Kuvapyramidit - Toinen tapa muuttaa kokoa
- 6. Rajaus - Leikkaa haluamasi kuva-alue
- 7. Aritmeettiset toiminnot kuvien kirkastamiseksi ja tummentamiseksi
Edellisessä opetusohjelmassa olemme oppineet OpenCV: stä ja tehneet joitain peruskuvankäsittelyjä käyttämällä sitä, kuten harmaa skaalaus, värikylläisyys, histogrammi, väriavaruudet, RGB-komponentti jne. Kuten edellisessä opetusohjelmassa kerrottiin, OpenCV on avoimen lähdekoodin Commuter Vision -kirjasto, joka on C ++, Python ja Java -rajapinnat ja tukee Windows-, Linux-, Mac OS-, iOS- ja Android-käyttöjärjestelmiä. Joten se voidaan helposti asentaa Raspberry Pi -ohjelmaan Python- ja Linux-ympäristössä. Ja Vadelma Pi: tä, jossa on OpenCV ja liitetty kamera, voidaan käyttää luomaan monia reaaliaikaisia kuvankäsittelysovelluksia, kuten kasvojentunnistus, kasvojen lukitus, esineiden seuranta, auton rekisterikilven tunnistus, kodin turvajärjestelmä jne.
Tässä opetusohjelmassa aiomme nähdä, miten aiomme käsitellä kuvaa OpenCV: llä. Tässä opitaan soveltamaan seuraavaa toimintoa kuvaan OpenCV: n avulla:
- Kuvamuutokset - affinien ja muiden kuin affiinien muunnokset
- Kuvan käännökset - liikkuva kuva ylös, alas, vasemmalle ja oikealle
- Kuvan kierto - Kuvan pyöriminen
- Skaalaus, koon muuttaminen ja interpolointi
- Kuvapyramidit - Toinen tapa muuttaa kokoa
- Rajaus - Leikkaa haluamasi kuva-alue
- Aritmeettiset toiminnot kuvien kirkastamiseksi ja tummentamiseksi
1. Kuvan muunnokset - affinien ja muiden kuin afiinien muunnokset
Transformaatiot ovat kuvaan kohdistuvia geometrisia vääristymiä, vääristymät eivät tässä tarkoita tarkalleen virheitä, vaan korjaustyyppiä kuvan sieppauksesta aiheutuvien näkökulmien korjaamiseksi. Kuvamuunnoksia on kahta tyyppiä - Affine ja Non-Affine
Affiinimuunnokset ovat kolmentyyppisiä skaalaus, kiertäminen ja kääntäminen, affiinimuunnoksissa on tärkeää, että linjat ovat yhdensuuntaiset ennen kuvanmuunnoksia ja niiden jälkeen.
Ei-affiiniset muunnokset tai projektiiviset muunnokset eivät säilytä rinnakkaisuutta, pituutta tai kulmaa, mutta kuitenkin säilyttävät kollineaarisuuden ja esiintyvyyden, kollineaarisuus tarkoittaa, että kaksi pistettä ovat samalla suoralla.
Ei-affiiniset muunnokset ovat hyvin yleisiä tietokonenäkössä ja ne syntyvät eri kamerakulmista. Ei-affiinisia tai projektiivisia transformaatioita kutsutaan myös homografiaksi.
2. Kuvan käännökset - Liikkuva kuva ylös, alas, vasemmalle ja oikealle
Kuvan kääntäminen siirtää kuvaa ylös, alas, vasemmalle ja oikealle ja jopa diagonaalisesti, jos toteutamme x- ja y-käännökset samanaikaisesti.
Kuvakäännösten suorittamiseen käytämme nyt opencv: n warpAffine-toimintoa, cv2.warpAffine käytetään näiden käännösten toteuttamiseen, mutta siihen tarvitaan käännösmatriisi.
Käännösmatriisi, T = 1 0 Tx
0 1 ty
T X, T y ovat suunnat, joihin kuva siirtyy.
Missä T X on siirtymä X-akselia pitkin (vaaka)
T Y on siirtymä Y-akselia pitkin (pystysuora)
# tämä on affiininen muunnos, joka yksinkertaisesti muuttaa kuvan sijaintia # käytämme cv2.warpAffine näiden muutosten toteuttamiseen. tuo cv2 tuoda numerotiedosto np image = cv2.imread ('input.jpg') # tallentaa kuvan korkeuden ja leveyden , leveys = image.shape tulosta (image.shape) quater_height, quater_width = korkeus / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (kuva, T, (leveys, korkeus)) tulosta (T) cv2.imshow ('alkuperäinen_kuva', kuva) cv2.waitKey (0) cv2.imshow (' Käännös ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Konsolin ulostulo - (183, 275) - korkeus ja leveys
- T-matriisi
]
3. Kuvan kierto - Kuvan pyöriminen
Kuvan kääntäminen kiertää kuvaa pisteen tai kuvan keskellä olevan pisteen ympäri, samalla tavalla kuin kiertokohta toimii kuin kääntö.
Kuten käännöksessä, meillä on T-matriisi, todennäköisesti rotaatiossa M-matriisi
Pyörimismatriisi, M-matriisi = Cosθ-Sin
Sinθ Cosθ
Missä θ on kiertokulma vastapäivään mitattuna.
Lisäksi on syytä huomata, että OpenCV: n avulla voit myydä ja kiertää kuvaa samanaikaisesti käyttämällä toimintoa cv2.getRotationMatrix2D (kiertokeskus_x, kiertokeskus_y, kiertokulma, asteikko)
Käytämme edelleen opencv: n warpAffine-funktiota kuvan pyörimisen saamiseksi, mutta käännösmatriisin sijaan, kuten edellisessä tapauksessa, käytämme kiertomatriisia.
tuo cv2 tuoda numerotiedosto np image = cv2.imread ('input.jpg') korkeus, leveys = image.shape #jaka korkeus ja leveys 2: llä kiertääksesi kuvaa sen keskipisteellä pyörimismatriisi = cv2.getRotationMatrix2D ((leveys / 2, height / 2), 90,1) rotated_image = cv2.warpAffine (kuva, kierto_matriisi, (leveys, korkeus)) cv2.imshow ('alkuperäinen kuva', kuva) cv2.waitKey (0) cv2.imshow ('käännetty kuva ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Nyt kuvaa on kierretty 90 astetta, se rajataan kankaan koon takia, koska kankaan koko pysyy samana, mutta kuvan kääntämisen takia se ei sovi kankaan kokoon. Se voidaan säätää asettamalla skaalauskerroin negatiiviseksi, mutta se sallii kuvan taustan mustan taustan.
Joten voit asettaa kuvan korkeuden ja leveyden ennakoimalla sitä tai arvaamalla sen tai on olemassa toinen tapa kiertää kuvaa siirtämällä se toiselle puolelle, mutta se kiertäisi kuvaa 90 asteen kerrannaisilla vastapäivään.
4. Skaalaus, koon muuttaminen ja interpolointi
Skaalaus ja koon muuttaminen ovat affiinisia muunnoksia, kuvan koon muuttaminen on mitä olemme tehneet melko pitkään ja olemme myös käsitelleet interpolointia, kuten kun muutat kuvan kokoa suuremmaksi, jossa laajennamme pikseleitä, kuvassa on joitain aukkoja. pikseliä ja siellä interpolointi tulee sisään.
Se voi tapahtua suurentamalla kuvan kokoa pienemmäksi tai pienentämällä kuvan kokoa suuremmaksi pienemmäksi.
Teknisesti interpolointi on menetelmä uusien datapisteiden (pikseleiden) rakentamiseksi erillisten tunnettujen datapisteiden joukossa.
OpenCV: ssä on erilaisia interpolointimenetelmiä
cv2.INTER_AREA - hyvä kutistamiseen tai näytteenottoon
cv2.INTER_NEAREST - nopein
cv2.LINEAR - hyvä zoomaukseen tai näytteenottoon (oletus)
cv2.CUBIC - parempi
cv2.INTER_LANCZOS4 - paras
# koon muuttaminen on erittäin helppoa käyttämällä cv2.resize-funktiota, sen argumentit ovat # cv2.resize (kuva, dsize (ulostulokuvan koko), x_scale, y_scale, interpolointi) tuoda cv2 import numpy muodossa np image = cv2.imread ('input. jpg ') cv2.imshow (' Alkuperäinen_kuva ', kuva) cv2.waitKey (0) # Tehdään kuvasta 3/4 alkuperäisen kuvan koko eli pienennetään 75 prosenttiin image_scaled = cv2.resize (kuva, Ei mitään, fx = 0,75, fy = 0,75) # koska lineaarinen interpolointi on avoimen cv: n oletusmenetelmä, sitä ei tarvitse toteuttaa funktiona. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # kaksinkertaistetaan kuvamme koko img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # tehdään koko tarkkojen mittojen mukaan image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Kuvapyramidit - Toinen tapa muuttaa kokoa
Pyramidikuvalla tarkoitetaan joko skaalausta (kuvien suurentaminen) tai pienentämistä (kutistuvat kuvat).
Se on yksinkertaisesti erilainen tapa muuttaa kokoa, jonka avulla voimme skaalata kuvia helposti ja nopeasti pienentämällä uuden kuvan korkeutta ja leveyttä puoleen.
Tästä on hyötyä, kun tehdään kohteiden ilmaisimia, jotka skaalaa kuvia aina, kun se etsii kohdetta.
tuo cv2 image = cv2.imread ('input.jpg') pienempi = cv2.pyrDown (kuva) suurempi = cv2.pyrUp (pienempi) cv2.imshow ('alkuperäinen', kuva) cv2.waitKey (0) cv2.imshow ('pienempi', pienempi) cv2.waitKey (0) cv2.imshow ('suurempi', suurempi) cv2.waitKey (0) cv2.destroyAllWindows ()
Suuremmassa kuvassa huomaat, että alkuperäisen kuvan koko on edelleen samankokoinen, koska se muuttuu pienemmästä kuvasta suoraan suuremmaksi. Mutta jos interpoloimme sen, kuvanlaatu paranee edellisestä, koska interpolointi arvioi pikselit täyttäen välilyöntejä kuvan suurennuksen yhteydessä.
Nyt saman koodin käyttäminen kuutiointerpoloinnilla antaa paremman kuvan suurelle kuvalle. Kuvien alapuolella näkyy vertailu alkuperäisen kuvan, kuvan suurennetun version, pienemmän kuvan ja pienemmän kuvan kuutiomaisen interpoloidun version välillä.
tuo cv2 image = cv2.imread ('input.jpg') pienempi = cv2.pyrDown (kuva) suurempi = cv2.pyrUp (pienempi) cv2.imshow ('alkuperäinen', kuva) cv2.waitKey (0) cv2.imshow ('pienempi', pienempi) cv2.waitKey (0) cv2.imshow ('suurempi', suurempi) cv2.waitKey (0) # parantaa muunnetun suuremman kuvan laatua pienemmästä kuvasta käyttämällä kuutiointerpolaatiota img_double = cv2.resize (pienempi, Ei mitään, fx = 2, fy = 2, interpolointi = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
HUOMAUTUS: Jos haluat luoda useita pieniä kopioita kuvien menossa pienempiä kooltaan tai useita suuria kopioita kuvia jatkuvasti kasvaa kokoa, voimme käyttää varten silmukoita tai kun silmukoita pitämään sisällä pyrDown tai pyrUp toimintoa.
6. Rajaus - Leikkaa haluamasi kuva-alue
Kuvien rajaaminen viittaa kuvan segmentin purkamiseen.
OpenCV: llä ei suoraan ole rajaustoimintoa, mutta se voidaan tehdä helposti numerolla alla olevan koodin avulla
Rajattu = kuva
Laitamme kuvaryhmän ja käyttämällä indeksointityökaluja tai -menetelmää numpy: ssä, määritämme aloitusrivin loppuriville ja aloitussarakkeen lopusta sarakkeeseen erotettuna pilkulla, joka poimii suorakaiteen, jonka haluamme rajata kuvan saamiseksi.
tuo cv2 tuoda numerotiedosto np image = cv2.imread ('input.jpg') korkeus, leveys = image.shape # haetaan aloituspikselikoordinaatit (suorakulmion rajaus vasemmasta yläkulmasta) start_row, start_col = int (height *.25), int (leveys *.25) # haetaan loppupikselikoordinaatit (alhaalla oikealla) end_row, end_col = int (height *.75), int (width *.75) # yksinkertaisesti käytä indeksointia rajaamaan haluamasi suorakaide = kuva cv2.imshow ("alkuperäinen kuva", kuva) cv2.waitKey (0) cv2.imshow ("rajattu kuva", rajattu) cv2.waitKey (0) cv2.destroyAllWindows ()
Huomaa, että voit käyttää pikseliarvoja suoraan start_col tai start_row sijasta, ne annetaan vain käyttäjän helpon tunnistamisen saamiseksi.
7. Aritmeettiset toiminnot kuvien kirkastamiseksi ja tummentamiseksi
Aritmeettiset operaatiot OpenCV: ssä ovat matriisien lisääminen tai vähentäminen kuvaan, matriisien lisääminen tai vähentäminen vaikuttaa kirkkauden kasvuun tai vähenemiseen.
Joten matriisien lisäämiseksi tai vähentämiseksi meidän on luotava ne ja numerolla on funktio, jota kutsutaan nimellä np.ones, joka antaa matriisit, joiden koko on yhtä suuri kuin kuvassamme .
import cv2 import numpy as np image = cv2.imread ('input.jpg') #luodaan matriisi yhdestä ja kerro se sitten skaalaajalla 100 ' # np.ones antaa matriisin, jolla on sama ulottuvuus kuin kuvallamme kaikilla arvot ovat 100 tässä tapauksessa M = np.ones (image.shape, dtype = "uint8") * 100 # käytämme tätä lisäämään tämän matriisin M kuvallemme # Huomaa kirkkauden lisäys = cv2.add (image, M) cv2.imshow ("Lisätty", lisätty) cv2.waitKey (0) #voin myös vähentää # huomaa, että kirkkauden lasku vähennetty = cv2.subtract (kuva, M) cv2.imshow ("vähennetty", vähennetty) cv2.waitKey (0) cv2.destroyAllWindows ()
Näin OpenCV: tä voidaan käyttää monien erilaisten kuvankäsittelytoimintojen käyttöön kuvassa. Jatkamme muiden kuvankäsittelytoimintojen käyttöä seuraavassa opetusohjelmassa.