- Što su slike?
- Kako računalo pohranjuje slike
- Zašto je stroju teško prepoznati slike
- Primjena i namjene OpenCV-a
- Instaliranje OpenCV-a s Pythonom i Anacondom
- Otvaranje i spremanje slika u OpenCV
- Siva skalirajuća slika u OpenCV-u
- Prostori boja
- Istraživanje pojedinih komponenata RGB slike
- Pretvaranje slike u pojedinačnu RGB komponentu
- Prikaz histograma slike
- Crtanje slika i oblika pomoću OpenCV-a
Umjetnost je način viđenja, i kažu da je viđenje vjerovanje, ali vrijedi i suprotno, vjerovanje viđenje i stvarno je teško zamisliti život na ovom svijetu bez dara vida - naše oči, kako je divno biti dijete kad nam se oči tek otvore, vidimo svijet i počnemo prepoznavati i vidjeti svijet oko sebe, ali kako vrijeme prolazi, isto to divno iskustvo postaje svakodnevno. Ali kako napredujemo s tehnologijom, na pragu smo da je i strojevi mogu vidjeti i razumjeti. Trenutno ne izgleda znanstveno-fantastično ako telefon otključate samo licem, ali priča o razvoju strojnog vida datira unatrag više od 20 godina.
Početni formalni korak na ovom polju poduzet je 1999. godine u okviru Intelove inicijative, kada su sva istraživanja koja su se odvijala surađivana u okviru OPEN CV-a (računarskog vida otvorenog koda), izvorno napisanog na C ++, s prvim većim izdanjem 1.0, 2006. godine. 2009. godine, treći u 2015. i četvrti tek sada u 2018. Sad OpenCV ima sučelja C ++, Python i Java 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.
Prije nego što počnete učiti obradu slika pomoću openCV -a, važno je znati što su to slike i kako ih ljudi i strojevi percipiraju.
Što su slike?
Slike su dvodimenzionalni prikaz spektra vidljive svjetlosti. A spektar vidljive svjetlosti samo je dio elektromagnetskog spektra koji leži tamo između infracrvenog i ultraljubičastog spektra.

Kako nastaju slike: - kada se svjetlost odbije od predmeta na filmu, senzoru ili na mrežnici.

Na ovaj način rade naše oči, koristeći prepreku da blokira većinu točaka svjetla, ostavljajući mali otvor kroz koji svjetlost može proći, naziva se otvorom i tvori mnogo fokusiranu sliku i djelotvoran je model za kameru s rupama, ali postoji problem u kameri s rupama s pin-om, ta ista količina svjetlosti ulazi u otvor, što ne može biti prikladno za film ili oblikovanu sliku, a također ne možemo dobiti fokusiranu sliku, kako bismo fokusirali sliku koju film treba pomicati naprijed-natrag, ali to je u mnogim situacijama problematično.

Ili taj problem možemo riješiti pomoću leća, on nam omogućuje kontrolu veličine otvora, a na fotografiji poznat kao f Stop, općenito je niža vrijednost f Stop je bolja u fotografiji.
Veličina otvora također nam omogućuje da uđemo u lijepu dubinsku oštrinu koja se na fotografiji naziva Bokeh, omogućuje nam zamućenu pozadinu dok se fokusiramo na sliku.
Kako računalo pohranjuje slike
Možda ste čuli za razne formate slika kao što su.png,.jpgG i itd. Sve su to digitalni prikaz našeg analognog svijeta, računala to čine prevođenjem slike u digitalni kod za pohranu, a zatim datoteku interpretiraju natrag u sliku za prikaz. Ali u osnovi koriste zajedničku platformu za pohranu slika, a isto vrijedi i za openCV.
OpenCV za svoje slike prema zadanim postavkama koristi prostor boja RGB (crvena, zelena i plava), gdje svaka koordinata piksela (x, y) sadrži 3 vrijednosti u rasponu za intenzitete u 8-bitnom obliku, tj. (0-255, 2 8).
Miješanje različitih intenziteta svake boje daje nam puni spektar, zato se u slikarstvu ili umjetnosti ove tri boje smatraju primarnim bojama, a sve ostale sekundarnim, jer većinu sekundarnih boja mogu oblikovati primarne boje. Kao i za žutu, imamo sljedeće vrijednosti: Crvena - 255; Zelena - 255; Plava - 0.
Sada su slike pohranjene u višedimenzionalne nizove. U programiranju, niz je niz zbirki objekata. I ovdje imamo posla s tri vrste nizova 1D, 2D i 3D gdje 'D' znači dimenzionalni.

Slike u boji pohranjuju se u trodimenzionalne nizove, gdje treća dimenzija predstavlja RGB boje (što ćemo vidjeti kasnije), a zajedno tvore različite intenzitete piksela za sliku, dok su crno-bijele slike pohranjene u dvodimenzionalne nizove a također postoje dvije vrste crno-bijelih slika u sivim tonovima i binarne slike.
Slike u sivim tonovima oblikuju se iz nijansi sive boje dvodimenzionalnog niza, dok su binarne slike piksela crne ili bijele boje.
Zašto je stroju teško prepoznati slike
Računalni vid sam po sebi izazovan je zadatak, možete i sami zamisliti koliko je teško stroju pružiti osjećaj vida, prepoznavanja i identifikacije. Postoje sljedeći čimbenici koji čine računalni vid toliko teškim.
- Ograničenja senzora i objektiva kamere
- Varijacije točke gledišta
- Promjena osvjetljenja
- Skaliranje
- Okluzije
- Varijacije klase predmeta
- Dvosmislene slike / optičke iluzije
Primjena i namjene OpenCV-a
Unatoč poteškoćama, Computer Vision ima mnogo priča o uspjehu
- Robotska navigacija - Samovozeći automobili
- Otkrivanje i prepoznavanje lica
- Pretraživanje slika pretraživača
- Čitanje registarske pločice
- Prepoznavanje rukopisa
- Snapchat i filtri za lice
- Prepoznavanje predmeta
- Praćenje lopte i igrača u sportu
- I još mnogo toga!
Instaliranje OpenCV-a s Pythonom i Anacondom
OpenCV je napisan na jeziku C ++, ali vrlo je teško implementirati ga sa C ++-om, pa ga stoga odlučujemo implementirati jezikom visoke razine kao python, a također postoje i dodatne prednosti implementacije OpenCV-a s pythonom jer je Python jedan od najlakših jezika za početnike Izuzetno je moćan za aplikacije za znanost o podacima i za strojno učenje, a također pohranjuje slike u numpy nizove što nam omogućuje da vrlo lako radimo neke vrlo moćne operacije.
Osnovno programiranje korisno je uz Izlaganje srednjoškolskoj matematici, web kameru, Python 2.7 ili 3.6 (poželjan je paket Anaconda).
Korak 1. Preuzmite i instalirajte Anaconda Python paket
Idite na: https://www.anaconda.com/download i odaberite prema vašem računalu vremenske prozore, Linux ili Mac i možete odabrati verziju python 2.7 ili python 3.7 za 64-bitne ili 32-bitne sustave, ali sada dnevno većina sustava je 64 bitna.
Anaconda distribucija pythona dolazi uz Spyder studio, jupyter bilježnice i anaconda prompt, što Pythona čini izuzetno prijatnim za upotrebu. Za primjere bismo koristili spyder studio.
Izbor između python 2.7 ili 3.7 potpuno je neutralan, no za primjere bismo koristili python 3.7 budući da je to budućnost pythona i preuzet će python 2.7 iz 2020, također se većina biblioteka razvija u python 3.7 budući aspekt pythona na umu. Također daje i očekivane rezultate na osnovnim matematičkim operacijama kao što je (2/5 = 2.5), dok bi python 2.7 to procijenio na 2. Također se ispis tretira kao funkcija u pythonu 3.7 (print ("bok"), tako daje praktične programere.
Korak 2. Stvaranje virtualne platforme s OpenCV-om
Mi ćemo instalirati OpenCV stvarajući virtualni platformu za Spyder pomoću Anaconda brz i na YML datoteka ovdje upload.
S YML datotekama instalirat ćemo sve potrebne pakete i biblioteke, no ako želite instalirati dodatne pakete, lako ih možete instalirati putem upita anaconda, pokretanjem naredbe tog paketa.
Idite na ikonu pretraživanja prozora i pronađite terminalski terminal anaconda, možete ga pronaći unutar mape anaconda koju ste upravo instalirali.
Zatim morate pronaći preuzetu YML datoteku, a odavde imate dva izbora: promijeniti direktorij terminala na mjesto gdje se preuzima YML datoteka ili kopirati YML datoteku u direktorij u kojem je instalirana vaša anaconda slučajevi bi se nalazili unutar pogona C: \, nakon kopiranja vaše YML datoteke na određeno mjesto, RUNIRAJTE sljedeću naredbu na svom odzivu
conda env create –f virtual_platform_windows.yml
Budući da se moj sustav izvodi na prozorima, YML datoteka i naredba odgovaraju prozorima, međutim, možete ga prilagoditi svom sustavu zamjenom Windows-a Linuxom ili Mac-om.
Napomena: - Ako izdvajanje paketa daje pogrešku, prvo instalirajte pytorch i numpy, a zatim pokrenite gornju naredbu.
Sada pronađite navigator anaconda i pojavio bi se padajući izbornik "Applications on ___", a odatle odaberite virtualno okruženje, a zatim odatle morate pokrenuti Spyder studio.
I to je to, spremni ste za početak!

Otvaranje i spremanje slika u OpenCV
Ovdje ćemo objasniti neke osnovne naredbe i terminologiju za upotrebu Pythona u OpenCV-u. Naučit ćemo o tri osnovne funkcije u OpenCV-u imread, imshow i imwrite.
# komentari u pythonu dati su simbolom #
Uvezite opencv u python naredbom
uvoz cv2
Učitajte sliku koristeći 'imread' određujući put do slike
image = cv2.imread ('input.jpg')
Sada se ta slika učitava i sprema u python kao varijabla koju smo nazvali slikom
Sada za prikaz naše varijable slike koristimo 'imshow', a prvi parametar za funkciju imshow je naslov prikazan na prozoru slike i mora se unijeti u ('') da bi se ime predstavljalo kao niz
cv2.imshow ('pozdrav svijetu', slika)
waitkey omogućuje nam unos podataka kada je prozor slike otvoren, ostavljajući ga praznim, on samo čeka pritiskanje bilo koje tipke prije nastavka, postavljanjem brojeva (osim 0), možemo odrediti kašnjenje koliko dugo držite prozor otvorenim (vrijeme u milisekundama ovdje).
cv2.waitKey ()
'killAllWindows' zatvara sve otvorene prozore, ako ovo ne postavite, vaš će program pasti.
cv2.destroyAllWindows ()

, za to ćemo koristiti numpy, numpy je knjižnica za programiranje na python za dodavanje podrške velikim višedimenzionalnim nizovima i matricama.
import cv2 #importing numpy import numpy kao np image = cv2.imread ('input.jpg') cv2.imshow ('hello_world', image) #shape funkcija je vrlo korisna kada gledamo dimenzije niza, to je vraća koricu koja daje dimenziju ispisa slike (image.shape) cv2.waitKey () cv2.destroyAllWindows ()
izlaz konzole - (183, 275, 3), Dvije dimenzije slike su 183 piksela u visinu i 275 piksela u širinu i 3 znači da postoje tri druge komponente (R, G, B) koje čine ovu sliku (prikazuje da su slike u boji pohranjene u trodimenzionalne nizove).
print ('Visina slike:', (image.shape, 'pikseli')) print ('Širina slike:', (image.shape, 'pikseli'))
izlaz konzole - Visina slike: (183, 'pikseli')
Širina slike: (275, 'pikseli')
Spremanje uređene slike u OpenCV
Za određivanje naziva datoteke i slike koju ćemo spremiti koristimo 'imwrite'.
cv2.imwrite ('output.jpg', slika) cv2.imwrite ('output.png', slika)
Prvi argument je naziv datoteke koju želimo spremiti, {za čitanje ili spremanje datoteke koju koristimo ('') da bismo je označili kao niz}, a drugi argument je naziv datoteke.
OpenCV omogućuje vam spremanje slike u različite formate.
Siva skalirajuća slika u OpenCV-u
Greyscaling je postupak kojim se slika pretvara iz pune boje u sjene sive (crno-bijele)
U opencv-u mnoge funkcije prikazuju skale u sivim tonovima prije obrade. To je učinjeno jer pojednostavljuje sliku, djelujući gotovo kao smanjenje šuma i povećavajući vrijeme obrade jer je na slici manje podataka (jer su sive slike pohranjene u dvodimenzionalne nizove).
uvoz cv2 # učitaj našu ulaznu sliku image = cv2.imread ('input.jpg') cv2.imshow ('original', slika) cv2.waitKey () # koristimo cvtcolor, za pretvaranje u sive grey_image = cv2.cvtColor (slika, cv2.COLOR_BGR2GREY) cv2.imshow ('sive boje', siva_slika) cv2.waitKey () cv2.destroyALLWindows ()

Jednostavniji način pretvaranja slike u sive tonove je samo dodavanje argumenta 0 u funkciji imread po strani imenu slike
uvoz cv2 grey_image = cv2.imread ('input.jpg', 0) cv2.imshow ('sivi tonovi', grey_image) cv2.waitKey () cv2.destroyAllWindows ()
import cv2 import numpy as np image = cv2.imread ('input.jpg') print (image.shape) cv2.imshow ('original', image) cv2.waitKey () grey_image = cv2.cvtColor (image, cv2.COLOR_BGR2GREY) cv2.imshow ('sive boje', siva_slika) ispis (siva_slika.oblik) cv2.waitKey () cv2.destroyALLWindows ()
Izlaz konzole: - (183, 275, 3) - za sliku u boji
(183, 275) - za sivu sliku
Stoga jasno pokazuje da su obojene slike predstavljene trodimenzionalnim nizovima, dok su sive slike dvodimenzionalnim nizovima.
Prostori boja
Prostori boja su način na koji se slike pohranjuju. RGB, HSV, CMYK su različiti prostori boja, to su samo jednostavni načini predstavljanja boje.
RGB - crvena, zelena i plava.
HSV - Nijansa, zasićenost i vrijednost.
A CMYK se obično koristi u inkjet pisačima.
RGB ili BGR prostor boja
Zadani prostor boja OpenCV-a je RGB. RGB je aditivni model boja koji generira boje kombinirajući plavu, zelenu i crvenu boju različitih intenziteta / svjetline. U OpenCV-u koristimo 8-bitne dubine boja.
- crvena (0-255)
- plava (0-255)
- Zelena (0-255)

Međutim, OpenCV zapravo pohranjuje boju u BGR formatu.
Zabavna činjenica: - U računalima koristimo BGR redoslijed zbog toga što se nepotpisani 32-bitni cijeli brojevi pohranjuju u memoriju, a na kraju se pohranjuju kao RGB. Cijeli broj koji predstavlja boju, npr.: - 0X00BBGGRR pohranit će se kao 0XRRGGBB.
HSV prostor bojaHSV (Hue, Saturation & value / Brightness) je prostor boja koji pokušava predstaviti boje koje ljudi percipiraju. Informacije o boji pohranjuje u cilindrični prikaz točaka RGB boja.
Nijansa - vrijednost boje (0-179)
Zasićenje - Živahnost boje (0-255)
Vrijednost - svjetlina ili intenzitet (0-255)
HSV format prostora boja koristan je u segmentaciji boja. U RGB-u filtriranje određene boje nije lako, no HSV olakšava postavljanje raspona boja za filtriranje određene boje onako kako ih mi doživljavamo.

Nijansa predstavlja boju u HSV-u, vrijednost nijanse kreće se od 0 - 180, a ne od 360, tako da ne završava puni krug i tako je mapirana drugačije od standardne.

Filtri raspona boja
- Crvena - (165-15)
- Zelena - (45-75)
- Plava - (90-120)
Kao što znamo da se slike čuvaju u RGB (crvenom, zelenom i plavom) prostoru boja, pa nam i OpenCV pokazuje isto, ali prvo što moramo upamtiti o opencv-ovom RGB formatu je da je to zapravo BGR i to možemo znati gledajući oblik slike.
import cv2 import numpy as np image = cv2.imread ('input.jpg') # B, G, R vrijednost za prvih 0,0 piksela B, G, R = ispis slike (B, G, R) ispis (slika.shape) # sada ako to primijenimo na sivoj skali gray_img = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) print (grey_img.shape) # grey_image vrijednost piksela za ispis 10,50 piksela (grey_img)
Izlaz konzole: ispis (B, G, R) - 6 11 10
ispis (image.shape) - (183, 275, 3)
ispis (grey_img.shape) - (183, 275)
ispis (grey_img) - 69
Sada na slici sive skale postoje samo dvije dimenzije, budući da se sjećamo da je slika u boji pohranjena u tri dimenzije, treća dimenzija je (R, G, B), dok su u sivim tonovima prisutne samo dvije dimenzije, budući da, B) je odsutan i za određeni položaj piksela dobivamo samo jednu vrijednost dok smo na obojenoj slici dobili tri vrijednosti.
Još jedan koristan prostor boja je HSV
import cv2 image = cv2.imread ('input.jpg') hsv_image = cv2.cvtColor (image, cv2.COLOR_BGR2HSV) cv2.imshow ('HSV image', hsv_image) cv2.imshow ('Hue channel', hsv_image) cv2. imshow ('zasićeni kanal', hsv_image) cv2.imshow ('kanal vrijednosti', hsv_image) cv2.waitKey () cv2.destroyAllWindows ()




Nakon pokretanja koda možete vidjeti četiri slike od kojih su tri pojedinačna kanala, a jedna kombinirana HSV slika.
Slika na nijansi kanala prilično je tamna jer vrijednost varira samo od 0 do 180.
Također imajte na umu da imshow funkcija pokušava prikazati RGB ili BGR sliku, ali HSV konverzija se preklapa.
Također, kanal vrijednosti bit će sličan nijansama sive slike zbog svoje svjetline.
Istraživanje pojedinih komponenata RGB slike
import cv2 image = cv2.imread ('input.jpg') # opencv podijeljena funkcija dijeli imageinti svaki indeks boja B, G, R = cv2.split (slika) cv2.imshow ("Crvena", R) cv2.imshow ("Zeleno", G) cv2.imshow ("Plavo", B) # stvaranje izvorne slike spajanjem pojedinih komponenata boje merged = cv2.merge () cv2.imshow ("spojeno", spojeno) # pojačavanje spojene plave boje = cv2.merge () cv2.imshow ("spojeno s plavim pojačavanjem", spojeno) # predstavljanje oblika pojedinih komponenata boje. # izlaz bi trebao biti samo dvodimenzionalni koji bi bili visina i širina, jer je treći element RGB komponente pojedinačno predstavljen print (B.shape) print (R.oblik) ispis (G.oblik) cv2.waitKey (0) cv2.destroyAllWindows ()





Izlaz konzole: #dimenzije slike iz funkcije oblika
(183, 275)
(183, 275)
(183, 275)
Pretvaranje slike u pojedinačnu RGB komponentu
U donjem kodu stvorili smo matricu nula s dimenzijama slike HxW, nula vraća niz ispunjen nulama, ali jednakih dimenzija.
Funkcija oblika vrlo je korisna kada gledamo dimenziju slike, a ovdje smo napravili rezanje te funkcije oblika. Dakle, oblik bi zahvaćao sve do određenih točaka, tj.Dosekunde označenih točaka koje bi bile visina i širina slike, jer treća predstavlja RGB komponentu slike i ovdje nam nije potrebna.
import cv2 import numpy as np image = cv2.imread ('input.jpg') B, G, R = cv2.split (image) nula = np.zeros (image.shape, dtype = "uint8") cv2.imshow ("CRVENA", cv2.merge ()) cv2.imshow ("Zelena", cv2.merge ()) cv2.imshow ("Plava", cv2.merge ()) cv2.waitKey (0) cv2.destroyAllWindows ()



Prikaz histograma slike
Prikaz histograma slike metoda je vizualizacije komponenata slike.
Sljedeći kod omogućuje vam analizu slike kroz histogram boja njegovih kombiniranih i pojedinačnih komponenata boje.
import cv2 import numpy kao np # trebamo uvesti matplotlib da bismo kreirali histogram plohe import matplotlib.pyplot kao plt image = cv2.imread ('input.jpg') histogram = cv2.calcHist (,, Nijedan,,) # ucrtavamo histogram, ravel () preusmjerava naš niz slika plt.hist (image.ravel (), 256,) plt.show () #viewing odvojeni kanali boja color = ('b', 'g', 'r') # znamo odvojite boju i iscrtajte svaku u histogramu za i, col u enumerate (color): histogram2 = cv2.calcHist (,, Nijedan,,) plt.plot (histogram2, color = col) plt.xlim () plt.show ()




Razumijemo funkciju calcHist sa svakim njenim pojedinačnim parametrima
cv2.calcHist (slike, kanali, maska, velika veličina , rasponi)
Slike: izvorna je slika tipa uint 8 ili float 32. Trebalo bi je dati u uglastim zagradama, tj. "", Što također ukazuje na njen niz druge razine, jer je slika za opencv podatak u obliku polja.
Kanali: daje se i u uglastim zagradama. To je indeks kanala za koji kalkuliramo histogram, na primjer, ako je ulaz slika u sivim tonovima, vrijednost mu je, za slike u boji koje možete proslijediti, ili za izračunavanje histograma plavog, zelenog i crvenog kanala.
Maska: slika maske. kako bi se pronašao histogram pune slike, daje se kao "nijedan". ali ako želite pronaći histogram određenog područja slike, za to morate stvoriti sliku maske i dati je kao masku.
Histize: Ovo predstavlja naše BIN brojanje. Potrebno je dati u uglastim zagradama za punu skalu koju prolazimo.
Rasponi: Ovo je naš raspon, obično je
Crtanje slika i oblika pomoću OpenCV-a
Ispod je nekoliko primjera za crtanje linija, pravokutnika, mnogougla, kruga itd. U OpenCV-u.
import cv2 import numpy kao np #stvaranje crne kvadratne slike = np.zeros ((512,512,3), np.uint8) #moguće je i crno-bijelo, ali ne bi bilo promjena image_bw = np.zeros ((512,512), np.uint8) cv2.imshow ("crni pravokutnik (boja)", slika) cv2.imshow ("crni pravokutnik (crno-bijela)", image_bw)


Crta
#stvari liniju preko crnog kvadrata # cv2.line (slika, početne koordinate, završne koordinate, boja, debljina) #crtanje dijagonalne crte debljine 5 piksela image = np.zeros ((512,512,3), np.uint8) cv2.line (slika, (0,0), (511,511), (255,127,0), 5) cv2.imshow ("plava linija", slika)

Pravokutnik
#stvari pravokutnik preko crnog kvadrata # cv2.pravokutnik (slika, početne koordinate, završne koordinate, boja, debljina) # crtanje pravokutnika debljine 5 piksela image = np.zeros ((512,512,3), np.uint8) cv2.rectangle (slika, (30,50), (100,150), (255,127,0), 5) cv2.imshow ("pravokutnik", slika)

#kreiranje kruga preko crnog kvadrata # cv2.circle (slika, središte, radijus, boja, ispuna) image = np.zeros ((512,512,3), np.uint8) cv2.circle (slika, (100,100), (50), (255.127,0), - 1) cv2.imshow ("krug", slika)

#kreiranje slike poligona = np.zeros ((512,512,3), np.uint8) #lets definiraju četiri točke pts = np.array (,,,], np.int32) #lets sada preoblikuju naše točke u obliku koji zahtijeva polilinija pts = pts.reshape ((- 1,1,2)) cv2.polylines (slika,, True, (0,255,255), 3) cv2.imshow ("poligon", slika)

# unos teksta pomoću opencv # cv2.putText (slika, 'tekst za prikaz', početna lijeva početna točka, font, veličina fonta, boja, debljina) image = np.zeros ((512,512,3), np.uint8) cv2. putText (slika, "hello world", (75,290), cv2.FONT_HERSHEY_COMPLEX, 2, (100,170,0), 3) cv2.imshow ("hello world", image) cv2.waitKey (0) cv2.destroyAllWindows ()

Computer Vision i OpenCV vrlo su velike teme koje treba pokriti, ali ovaj vodič bio bi dobro polazište za učenje OpenCV-a i obrade slika.

