- Què són les imatges?
- Com emmagatzema l’ordinador les imatges
- Per què és difícil per a una màquina identificar imatges
- Aplicació i usos d'OpenCV
- Instal·lació d’OpenCV amb Python i Anaconda
- Obrir i desar imatges a OpenCV
- Imatge d’escala de grisos a OpenCV
- Espais de colors
- Exploració de components individuals de la imatge RGB
- Converteix la imatge en un component RGB individual
- Representació de la imatge per histograma
- Dibuixar imatges i formes mitjançant OpenCV
L’art és una manera de veure, i diuen que veure és creure, però també passa el contrari, creure és veure i és molt difícil imaginar viure en aquest món sense el do de la visió: els nostres ulls, que meravellós és ser un infant quan els nostres ulls s’obren, veiem el món i comencem a reconèixer i veure el món que ens envolta, però a mesura que passa el temps, la mateixa experiència meravellosa es converteix en una realitat mundana. Però a mesura que avancem amb la tecnologia, estem en un punt on les màquines també la poden veure i comprendre. Actualment, no sembla una ciència ficció si només desbloqueja el telèfon amb la cara, però la història del desenvolupament de la visió artificial es remunta a més de vint anys.
El pas formal inicial en aquest camp es va reprendre el 1999 en una iniciativa d'Intel, quan tota la investigació que es realitzava es va col·laborar en virtut de l' Open CV (Open Source computer vision), originalment escrit en C ++, amb el seu primer llançament important 1.0 el 2006 el segon el 2009, el tercer el 2015 i el quart ara mateix el 2018. Ara OpenCV té interfícies C ++, Python i Java i és compatible amb Windows, Linux, Mac OS, iOS i Android. Per tant, es pot instal·lar fàcilment a Raspberry Pi amb entorns Python i Linux. I Raspberry Pi amb OpenCV i càmera connectada es pot utilitzar per crear moltes aplicacions de processament d’imatges en temps real, com ara detecció de cares, bloqueig de cares, seguiment d’objectes, detecció de matrícules de cotxes, sistema de seguretat domèstica, etc.
Abans d’aprendre el processament d’imatges mitjançant openCV, és important saber què són les imatges i com els humans i les màquines perceben aquestes imatges.
Què són les imatges?
Les imatges són una representació bidimensional de l’espectre de llum visible. I l’espectre de llum visible és només una part de l’espectre electromagnètic que hi ha entre l’espectre d’infrarojos i ultraviolats.

Com es formen les imatges: - quan una llum es reflecteix en un objecte sobre una pel·lícula, un sensor o sobre la retina.

Així és com funcionen els nostres ulls, mitjançant una barrera per bloquejar la major quantitat de llums que deixen una petita obertura per on pot passar la llum, es denomina obertura i forma una imatge molt enfocada i és un model de treball per a una càmera de forat de pins. però hi ha un problema en una càmera amb forat de pin, la mateixa quantitat de llum que entrarà a l'obertura, que no podria ser adequada per a la pel·lícula o la imatge formada, a més no podem obtenir una imatge enfocada, de manera que enfocem cal moure la pel·lícula cap endavant i cap enrere, però això és problemàtic en moltes situacions.

O podem solucionar aquest problema mitjançant l’ús d’objectius, ens permet controlar la mida de l’obertura i, en fotografia, es coneix com a f Stop, en general el valor de f Stop és millor en fotografia.
La mida de l’obertura també ens permet entrar a una bona profunditat de camp anomenada Bokeh a la fotografia, ens permet tenir un fons borrós mentre ens centrem en la imatge.
Com emmagatzema l’ordinador les imatges
És possible que hagueu sentit a parlar de diversos formats d’imatge com.png,.jpgG, etc., tot això és representació digital del nostre món analògic, els ordinadors ho fan traduint la imatge en codi digital per emmagatzemar-la i després interpreten el fitxer de nou en una imatge per visualització. Però, bàsicament, utilitzen una plataforma comuna per emmagatzemar les imatges, i el mateix passa amb openCV.
OpenCV utilitza l'espai de color RGB (vermell, verd i blau) per defecte per a les seves imatges, on cada coordenada de píxels (x, y) conté 3 valors que varien per a intensitats en forma de 8 bits, és a dir (0-255, 2 8).
La barreja de diferents intensitats de cada color ens proporciona l’espectre complet, per això en la pintura o l’art es considera aquests tres colors com a colors primaris i tots els altres com a secundaris, perquè la majoria dels colors secundaris poden estar formats per colors primaris. Com per al groc, tenim els valors següents: Vermell - 255; Verd - 255; Blau - 0.
Ara les imatges s’emmagatzemen en matrius multidimensionals. En la programació, array és una sèrie de col·leccions d'objectes. I aquí tractem tres tipus de matrius 1D, 2D i 3D on 'D' significa dimensional.

Les imatges de colors s’emmagatzemen en matrius tridimensionals, on la tercera dimensió representa els colors RGB (que veurem més endavant), i junts formen diferents intensitats de píxels per a una imatge, mentre que les imatges en blanc i negre s’emmagatzemen en matrius bidimensionals i també hi ha dos tipus d'imatges en blanc i negre en escala de grisos i imatges binàries.
Les imatges en escala de grisos es formen a partir de les tonalitats de gris d'una matriu bidimensional, mentre que les imatges binàries són de píxels en blanc o negre.
Per què és difícil per a una màquina identificar imatges
La visió per ordinador és una tasca desafiadora en si mateixa, us podeu imaginar el difícil que és donar a una màquina un sentit de la visió, el reconeixement i la identificació. Hi ha els següents factors que dificulten la visió per ordinador.
- Limitacions del sensor i de l’objectiu de la càmera
- Variacions de punts de vista
- Canvi d’il·luminació
- Escalat
- Oclusions
- Variacions de classe d'objectes
- Imatges ambigües / Il·lusions òptiques
Aplicació i usos d'OpenCV
Tot i la dificultat, Computer Vision té moltes històries d’èxit
- Navegació robòtica: cotxes autònoms
- Reconeixement i detecció de cares
- Cerca d'imatges del motor de cerca
- Lectura de la matrícula
- Reconeixement d’escriptura a mà
- Filtres de cara i Snapchat
- Reconeixement d'objectes
- Seguiment de pilota i jugador en esports
- I molts més!
Instal·lació d’OpenCV amb Python i Anaconda
OpenCV està escrit en C ++, però és molt difícil implementar-lo amb C ++ i, per tant, decidim implementar-lo amb un llenguatge d’alt nivell com a python, i també hi ha avantatges addicionals d’ implementar OpenCV amb python, ja que Python és un dels llenguatges més fàcils per a principiants també És extremadament potent per a aplicacions de ciència de dades i aprenentatge automàtic i també emmagatzema imatges en matrius numpy que ens permeten fer operacions molt potents amb força facilitat.
La programació bàsica és útil amb Exposure to High School Level Math, una càmera web, Python 2.7 o 3.6 (es prefereix el paquet Anaconda).
Pas 1. Descarregueu i instal·leu el paquet Anaconda Python
Aneu a: https://www.anaconda.com/download i trieu segons el temps de la vostra màquina les seves finestres, Linux o mac i podeu triar per a la versió python 2.7 o python 3.7 per a sistemes de 64 bits o sistemes de 32 bits, però ara uns dies la majoria del sistema té 64 bits.
La distribució anaconda de python ve juntament amb l’estudi Spyder, els quaderns jupyter i el prompt anaconda, cosa que fa que Python sigui molt fàcil d’utilitzar. Utilitzaríem spyder studio per fer els exemples.
L’elecció entre Python 2.7 o 3.7 és completament neutral, però, per als exemples , faríem servir Python 3.7 ja que és el futur de Python i assumirà Python 2.7 fins al 2020, també la majoria de les biblioteques es desenvolupen en Python 3.7 mantenint l’aspecte futur de Python al cap. També dóna els resultats esperats en operacions matemàtiques bàsiques com (2/5 = 2,5), mentre que el python 2.7 l’avaluaria a 2. També la impressió es tracta com una funció al python 3.7 (imprimir (“hola”)), de manera que dóna una mà directa als programadors.
Pas 2. Crear una plataforma virtual amb OpenCV
Anem a instal·lar OpenCV mitjançant la creació d'una plataforma virtual per spyder utilitzant Anaconda ràpida i l'arxiu pujat YML aquí.
Amb els fitxers YML instal·larem tots els paquets i biblioteques que serien necessaris, però, si voleu instal·lar cap paquet addicional, podeu instal·lar-lo fàcilment mitjançant la sol·licitud d’anaconda, executant l’ordre d’aquest paquet.
Aneu a la icona de cerca de Windows i cerqueu el terminal de sol·licitud anaconda, el trobareu a la carpeta anaconda que acabeu d’instal·lar.
A continuació, heu de trobar el fitxer YML descarregat i, a partir d’aquí, teniu dues opcions: canviar el directori del vostre terminal a la ubicació on es descarrega el fitxer YML o bé copiar el fitxer YML al directori on s’instal·la la vostra anaconda. casos estaria dins de C: \ drive, després de copiar el fitxer YML a la ubicació especificada. EXECUTI l'ordre següent a la vostra sol·licitud.
conda env create –f virtual_platform_windows.yml
Com que el meu sistema s’executa a Windows, el fitxer YML i l’ordre corresponen a Windows, no obstant, podeu modificar-lo segons el vostre sistema substituint Windows per Linux o Mac, respectivament.
Nota: - Si l'extracció del paquet dóna error, instal·leu primer pytorch i numpy i després executeu l'ordre anterior.
Ara cerqueu el navegador anaconda i hi hauria un menú desplegable "Aplicacions a ___" i des d'allà seleccioneu l'entorn virtual i, a partir d'aquí, haureu d'iniciar Spyder studio.
I ja està, ja estàs preparat per començar!

Obrir i desar imatges a OpenCV
Aquí expliquem algunes ordres bàsiques i terminologia per utilitzar Python a OpenCV. Coneixerem tres funcions bàsiques a OpenCV imread, imshow i imwrite.
Els # comentaris a Python vénen donats pel símbol #
Importeu opencv a python per ordre
importar cv2
Carregueu una imatge amb 'imread' especificant el camí cap a la imatge
image = cv2.imread ('input.jpg')
Ara aquesta imatge es carrega i s'emmagatzema a Python com a variable que hem anomenat com a imatge
Ara per mostrar la nostra variable d'imatge, fem servir 'imshow' i el primer paràmetre per a la funció imshow és el títol que es mostra a la finestra de la imatge i s'ha d'entrar a ('') per representar el nom com una cadena
cv2.imshow ("hola món", imatge)
La tecla d'espera ens permet introduir informació quan la finestra de la imatge està oberta, deixant-la en blanc, només espera que es premgui qualsevol tecla abans de continuar, posant números (excepte 0), podem especificar un retard quant de temps mantingueu la finestra oberta (temps aquí en mil·lisegons).
cv2.waitKey ()
'destroyAllWindows' tanca totes les finestres obertes; si no col·loqueu això, el vostre programa quedarà penjat.
cv2.destroyAllWindows ()

, per a això utilitzarem numpy, numpy és una biblioteca per a la programació de python per afegir suport a grans matrius i matrius multidimensionals.
import cv2 #importing numpy import numpy as np image = cv2.imread ('input.jpg') cv2.imshow ('hello_world', image) La funció #shape és molt útil quan estem veient les dimensions d'una matriu, retorna una tupla que dóna una dimensió d' impressió d' imatges (image.shape) cv2.waitKey () cv2.destroyAllWindows ()
sortida de la consola - (183, 275, 3), les dues dimensions de la imatge són 183 píxels d’alçada i 275 píxels d’amplada i 3 vol dir que hi ha altres tres components (R, G, B) que fan aquesta imatge (mostra que les imatges de colors s’emmagatzemen en matrius tridimensionals).
print ('Alçada de la imatge:', (image.shape, 'píxels')) print ('Amplada de la imatge:', (image.shape, 'píxels'))
sortida de la consola - Altura de la imatge: (183, 'píxels')
Amplada de la imatge: (275, 'píxels')
Desant la imatge editada a OpenCV
Utilitzem "imwrite" per especificar el nom del fitxer i la imatge que es vol desar.
cv2.imwrite ('output.jpg', imatge) cv2.imwrite ('output.png', imatge)
El primer argument és el nom del fitxer que volem desar, {per llegir o desar el fitxer que fem servir ('') per indicar-lo com una cadena} i el segon argument és el nom del fitxer.
OpenCV us permet desar la imatge en diferents formats.
Imatge d’escala de grisos a OpenCV
L’escala de grisos és el procés mitjançant el qual una imatge es converteix a tot color a tons de gris (blanc i negre)
En opencv, moltes funcions a escala de grisos de les imatges abans de processar-les. Això es fa perquè simplifica la imatge, actuant gairebé com una reducció de soroll i augmentant el temps de processament ja que hi ha menys informació a la imatge (ja que les imatges en escala de grisos s’emmagatzemen en matrius bidimensionals).
importa cv2 # carrega la nostra imatge d'entrada image = cv2.imread ('input.jpg') cv2.imshow ('original', imatge) cv2.waitKey () #utilitzem cvtcolor, per convertir a escala de grisos gray_image = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('escala de grisos', imatge_grisa) cv2.waitKey () cv2.destroyALLWindows ()

Una manera més senzilla de convertir la imatge en escala de grisos és simplement afegir l’argument 0 en funció imread a banda al nom de la imatge
import cv2 grey_image = cv2.imread ('input.jpg', 0) cv2.imshow ('escala de grisos', grey_image) cv2.waitKey () cv2.destroyAllWindows ()
importa cv2 importa numpy com np image = cv2.imread ('input.jpg') imprimeix (image.shape) cv2.imshow ('original', imatge) cv2.waitKey () gray_image = cv2.cvtColor (imatge, cv2.COLOR_BGR2GRAY) cv2.imshow ('escala de grisos', gris_imatge) imprimir (gris_imatge.shape) cv2.waitKey () cv2.destroyALLWindows ()
Sortida de la consola: - (183, 275, 3) - per a imatges en color
(183, 275): per a imatge en escala de grisos
Per tant, mostra clarament que les imatges en color es representen mitjançant matrius tridimensionals, mentre que les imatges a escala de grisos mitjançant matrius bidimensionals.
Espais de colors
Els espais de color són la manera com s’emmagatzemen les imatges. RGB, HSV, CMYK són els diferents espais de color, només són formes senzilles de representar el color.
RGB: vermell, verd i blau.
HSV - Tonalitat, saturació i valor.
I CMYK s’utilitza habitualment en impressores d’injecció de tinta.
Espai de color RGB o BGR
L’espai de color predeterminat d’OpenCV és RGB. RGB és un model de color additiu que genera colors combinant colors blaus, verds i vermells de diferents intensitats / brillantor. A OpenCV fem servir profunditats de color de 8 bits.
- Vermell (0-255)
- Blau (0-255)
- Verd (0-255)

No obstant això, OpenCV emmagatzema el color en format BGR.
Dades curioses: fem servir l’ordre BGR a les computadores a causa de com s’emmagatzemen a la memòria uns enters de 32 bits sense signar, que encara s’acaben emmagatzemant com a RGB. L'enter que representa un color, per exemple: - 0X00BBGGRR s'emmagatzemarà com a 0XRRGGBB.
Espai de color HSVHSV (Hue, Saturation & value / Brightness) és un espai de color que intenta representar els colors que els humans perceben. Emmagatzema informació de color en una representació cilíndrica de punts de color RGB.
Tonalitat: valor de color (0-179)
Saturació - Vibrància del color (0-255)
Valor: brillantor o intensitat (0-255)
El format d’espai de color HSV és útil en la segmentació del color. En RGB, filtrar un color específic no és fàcil, tot i que HSV facilita molt la configuració d’intervals de colors per filtrar el color específic tal com el percebem.

La tonalitat representa el color en HSV, el valor de la tonalitat oscil·la entre el 0 i el 180 i no pas el 360, de manera que no completa el cercle complet i, per tant, es mapeja de manera diferent a l’estàndard.

Filtres de gamma de colors
- Vermell - (165-15)
- Verd - (45-75)
- Blau - (90-120)
Com sabem, les imatges que s’emmagatzemen a l’espai de color RGB (vermell, verd i blau), OpenCV ens mostra el mateix, però el primer que cal recordar sobre el format RGB d’opencv és que en realitat és BGR i el podem saber mirant forma de la imatge.
importa cv2 importa numpy com np image = cv2.imread ('input.jpg') # B, G, valor R per al primer 0,0 píxel B, G, R = imprimir imatge (B, G, R) imprimir (imatge.shape) #now si ho apliquem a la imatge en escala de grisos gray_img = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) print (gray_img.shape) #gray_image valor del píxel per a la impressió de 10,50 píxels (gray_img)
Sortida de la consola: impressió (B, G, R) - 6 11 10
imprimir (image.shape) - (183, 275, 3)
print (gray_img.shape) - (183, 275)
imprimir (gris_img) - 69
Ara només hi ha dues dimensions en una imatge a escala de grisos, ja que recordem que la imatge en color s’emmagatzema en tres dimensions, la tercera dimensió és la (R, G, B), mentre que a escala de grisos només hi ha dues dimensions, ja que (R, G, B) està absent i per a una posició de píxel concreta només obtenim un valor únic, mentre que a la imatge de colors obtenim tres valors.
Un altre espai de color útil és 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 ('canal de saturació', hsv_image) cv2.imshow ('canal de valor', hsv_image) cv2.waitKey () cv2.destroyAllWindows ()




Després d'executar el codi, podeu veure les quatre imatges de les quals tres són dels canals individuals i una és una imatge HSV combinada.
La imatge del canal Hue és bastant fosca perquè el seu valor només varia de 0 a 180.
Tingueu en compte també que la funció imshow intenta mostrar-vos la imatge RGB o BGR, però la conversió HSV se superposa.
A més, el canal de valor serà similar a l’escala de grisos de la imatge per la seva brillantor.
Exploració de components individuals de la imatge RGB
importa cv2 image = cv2.imread ('input.jpg') La funció dividida de # opencv divideix la imatge de cada índex de color B, G, R = cv2.split (imatge) cv2.imshow ("Vermell", R) cv2.imshow ("verd", G) cv2.imshow ("blau", B) #making la imatge original mitjançant la fusió dels components de color individuals fusionades = cv2.merge () cv2.imshow ("fusionat", fusionat) #amplifying el color blau es va fusionar = cv2.merge () cv2.imshow ("combinat amb amplificar el blau", combinat) #representant la forma dels components de color individuals. # la sortida només tindria dues dimensions amb l'alçada i l'amplada, ja que el tercer element del component RGB és la impressió d'impressió representada individualment (forma B.) (R.forma) imprimir (forma G.) cv2.waitKey (0) cv2.destroyAllWindows ()





Sortida de la consola: #dimensions de la imatge a partir de la funció de forma
(183, 275)
(183, 275)
(183, 275)
Converteix la imatge en un component RGB individual
Al codi següent hem creat una matriu de zeros amb les dimensions de la imatge HxW, zero retorna una matriu plena de zeros però amb les mateixes dimensions.
La funció de forma és molt útil quan estem veient la dimensió d'una imatge, i aquí hem fet un tall d'aquesta funció de forma. Per tant, la forma ho agafaria tot fins a punts designats, és a dir, fins a segons punts designats, que serien l'alçada i l'amplada de la imatge, ja que el tercer representa el component RGB de la imatge i aquí no el necessitem.
import cv2 import numpy as np image = cv2.imread ('input.jpg') B, G, R = cv2.split (image) zeros = np.zeros (image.shape, dtype = "uint8") cv2.imshow ("VERMELL", cv2.merge ()) cv2.imshow ("Verd", cv2.merge ()) cv2.imshow ("Blau", cv2.merge ()) cv2.waitKey (0) cv2.destroyAllWindows ()



Representació de la imatge per histograma
La representació de l'histograma de la imatge és el mètode de visualització dels components de les imatges.
El següent codi us permet analitzar la imatge mitjançant l'histograma de colors dels components de color combinats i individuals.
import cv2 import numpy as np #we need to import matplotlib to create histogram plots import matplotlib.pyplot as plt image = cv2.imread ('input.jpg') histogram = cv2.calcHist (,, None,,) # we plot a histograma, ravel () aplana la nostra matriu d'imatges plt.hist (image.ravel (), 256,) plt.show () #viewing canals de color separats color = ('b', 'g', 'r') #sabem separeu el color i dibuixeu-los cadascun en histograma per a i, col en enumerar (color): histogram2 = cv2.calcHist (,, None,,) plt.plot (histogram2, color = col) plt.xlim () plt.show ()




Anem a entendre la calcHist funció amb cadascun dels seus paràmetres individuals
cv2.calcHist (imatges, canals, màscara, mida histstica , intervals)
Imatges: és la imatge font del tipus uint 8 o float 32. S'hauria de posar entre claudàtors, és a dir, "", que també indica la seva matriu de segon nivell ja que una imatge per a opencv és una forma de matriu.
Canals: també es dóna entre claudàtors. És l'índex del canal per al qual calculem l'histograma, per exemple, si l'entrada és una imatge en escala de grisos, el seu valor és, per a les imatges en color que podeu passar, o bé per calcular l'histograma del canal blau, verd i vermell respectivament.
Màscara: imatge de màscara. per trobar l'histograma de la imatge completa, es dóna com a "cap". però si voleu trobar l'histograma d'una regió d'imatge concreta, heu de crear una imatge de màscara i donar-la com a màscara.
Histsize: representa el nostre recompte de BIN. Cal indicar-lo entre claudàtors per a una escala completa que passem.
Gammes: normalment és la nostra gamma
Dibuixar imatges i formes mitjançant OpenCV
A continuació es mostren alguns exemples de dibuix de línies, rectangles, polígons, cercles, etc. a OpenCV.
import cv2 import numpy as np #creating a black square image = np.zeros ((512,512,3), np.uint8) #també podem crear-ho en blanc i negre, però no hi hauria canvis image_bw = np.zeros ((512.512), np.uint8) cv2.imshow ("rectangle negre (color)", imatge) cv2.imshow ("rectangle negre (B&W)", image_bw)


Línia
#crea una línia sobre el quadrat negre # cv2.line (imatge, coordenades inicials, coordenades finals, color, gruix) # dibuix d’una línia diagonal de gruix 5 píxels image = np.zeros ((512.512,3), np.uint8) cv2.line (imatge, (0,0), (511.511), (255.127,0), 5) cv2.imshow ("línia blava", imatge)

Rectangle
#crea un rectangle sobre un quadrat negre # cv2.rectangle (imatge, coordenades inicials, coordenades finals, color, gruix) #dibuixar un rectangle de gruix de 5 píxels image = np.zeros ((512.512,3), np.uint8) cv2.rectangle (imatge, (30,50), (100.150), (255.127,0), 5) cv2.imshow ("rectangle", imatge)

#creació d’ un cercle sobre un quadrat negre # cv2.circle (imatge, centre, radi, color, farciment) image = np.zeros ((512.512,3), np.uint8) cv2.circle (imatge, (100.100), (50), (255,127,0), - 1) cv2.imshow ("cercle", imatge)

#creació d’una imatge de polígon = np.zeros ((512.512,3), np.uint8) #lets defineixen quatre punts pts = np.array (,,,], np.int32) #lets ara transformen els nostres punts en la forma requerida per polilínies pts = pts.reshape ((- 1,1,2)) cv2.polylines (imatge,, True, (0.255.255), 3) cv2.imshow ("polígon", imatge)

#putting text using opencv # cv2.putText (image, 'text to display', bootom left start point, font, size font, color, espesor) image = np.zeros ((512.512,3), np.uint8) cv2. putText (imatge, "hola món", (75.290), cv2.FONT_HERSHEY_COMPLEX, 2, (100.170,0), 3) cv2.imshow ("hola món", imatge) cv2.waitKey (0) cv2.destroyAllWindows ()

La visió per computador i l’OpenCV són temes molt extensos per tractar, però aquesta guia seria un bon punt de partida per aprendre l’OpenCV i el processament d’imatges.
