- ¿Qué son las imágenes?
- Cómo almacena imágenes la computadora
- Por qué es difícil para una máquina identificar imágenes
- Aplicación y usos de OpenCV
- Instalación de OpenCV con Python y Anaconda
- Abrir y guardar imágenes en OpenCV
- Imagen de escala de grises en OpenCV
- Espacios de color
- Explorando componentes individuales de la imagen RGB
- Conversión de imagen en componente RGB individual
- Representación de histograma de imagen
- Dibujar imágenes y formas usando OpenCV
El arte es una forma de ver, y dicen que ver para creer, pero lo contrario también es cierto, creer para ver y es realmente difícil imaginar vivir en este mundo sin el don de la visión: nuestros ojos, lo maravilloso que es ser un bebé. cuando nuestros ojos se abren, vemos el mundo y comenzamos a reconocer y ver el mundo que nos rodea, pero a medida que pasa el tiempo, la misma experiencia maravillosa se vuelve mundana. Pero a medida que avanzamos con la tecnología, nos encontramos en un punto en el que las máquinas también pueden verla y comprenderla. Actualmente, no parece ser una ciencia ficción si simplemente desbloquea su teléfono con la cara, pero la historia del desarrollo de la visión artificial se remonta a más de 20 años.
El paso formal inicial en este campo se dio en 1999 en una iniciativa de Intel, cuando toda la investigación en curso se colaboró bajo el OPEN CV (Open Source computer vision), originalmente escrito en C ++, con su primera versión importante 1.0 en 2006 segundo en 2009, tercero en 2015 y cuarto en 2018. Ahora OpenCV tiene interfaces C ++, Python y Java y es compatible con Windows, Linux, Mac OS, iOS y Android. Por lo que se puede instalar fácilmente en Raspberry Pi con entorno Python y Linux. Y Raspberry Pi con OpenCV y cámara adjunta se puede utilizar para crear muchas aplicaciones de procesamiento de imágenes en tiempo real como detección de rostros, bloqueo de rostros, seguimiento de objetos, detección de matrículas de automóviles, sistema de seguridad para el hogar, etc.
Antes de comenzar a aprender el procesamiento de imágenes usando openCV, es importante saber qué son las imágenes y cómo los humanos y las máquinas perciben esas imágenes.
¿Qué son las imágenes?
Las imágenes son una representación bidimensional del espectro de luz visible. Y el espectro de luz visible es solo una parte del espectro electromagnético que se encuentra entre el espectro infrarrojo y ultravioleta.
Cómo se forman las imágenes: - cuando una luz se refleja de un objeto en una película, un sensor o en la retina.
Así es como funcionan nuestros ojos, usando una barrera para bloquear la mayor parte de las luces, dejando una pequeña abertura a través de la cual la luz puede pasar, se llama apertura, y forma una imagen muy enfocada y es un modelo de trabajo para una cámara de orificio. pero hay un problema en una cámara con orificios, esa misma cantidad de luz entrará en la apertura, lo que podría no ser adecuado para la película o la imagen formada, también no podemos obtener una imagen enfocada, para enfocar la imagen que Es necesario mover la película hacia adelante y hacia atrás, pero esto es problemático en muchas situaciones.
O podemos solucionar este problema usando lentes, nos permite controlar el tamaño de apertura, y en fotografía se lo conoce como f Stop, generalmente bajar el valor de f Stop es mejor en fotografía.
El tamaño de la apertura también nos permite obtener una buena profundidad de campo llamada Bokeh en fotografía, nos permite tener un fondo borroso mientras enfocamos la imagen.
Cómo almacena imágenes la computadora
Es posible que haya oído hablar de varios formatos de imagen como.png,.jpgG, etc., todo esto es una representación digital de nuestro mundo analógico, las computadoras lo hacen traduciendo la imagen a un código digital para su almacenamiento y luego interpretan el archivo de nuevo en una imagen para monitor. Pero, en lo básico, utilizan una plataforma común para almacenar las imágenes, y lo mismo ocurre con openCV.
OpenCV utiliza el espacio de color RGB (rojo, verde y azul) de forma predeterminada para sus imágenes, donde cada coordenada de píxel (x, y) contiene 3 valores que varían para las intensidades en forma de 8 bits, es decir (0-255, 2 8).
Mezclar diferentes intensidades de cada color nos da el espectro completo, por eso en pintura o arte estos tres colores se consideran colores primarios y todos los demás como secundarios, porque la mayoría de los colores secundarios pueden estar formados por colores primarios. Como para el amarillo, tenemos los siguientes valores: Rojo - 255; Verde - 255; Azul - 0.
Ahora las imágenes se almacenan en matrices multidimensionales. En programación, la matriz es una serie de colecciones de objetos. Y aquí tratamos con tres tipos de matrices 1D, 2D y 3D donde 'D' significa dimensional.
Las imágenes coloreadas se almacenan en matrices tridimensionales, donde la tercera dimensión representa los colores RGB (que veremos más adelante), y juntas forman diferentes intensidades de píxeles para una imagen, mientras que las imágenes en blanco y negro se almacenan en matrices bidimensionales. y también hay dos tipos de imágenes en blanco y negro Escala de grises e imágenes binarias.
Las imágenes en escala de grises se forman a partir de los tonos de gris de una matriz bidimensional, mientras que las imágenes binarias son de píxeles en blanco o negro.
Por qué es difícil para una máquina identificar imágenes
La visión por computadora es una tarea desafiante en sí misma, usted mismo puede imaginar lo difícil que es darle a una máquina un sentido de visión, reconocimiento e identificación. Los siguientes factores hacen que la visión por computadora sea tan difícil.
- Limitaciones del sensor y la lente de la cámara
- Ver variaciones de puntos
- Cambio de iluminación
- Escalada
- Oclusiones
- Variaciones de clase de objeto
- Imágenes ambiguas / ilusiones ópticas
Aplicación y usos de OpenCV
A pesar de la dificultad, Computer Vision tiene muchas historias de éxito
- Navegación robótica: vehículos autónomos
- Detección y reconocimiento de rostros
- Búsqueda de imágenes en motores de búsqueda
- Lectura de matrículas
- Reconocimiento de escritura a mano
- Snapchat y filtros faciales
- Reconocimiento de objetos
- Seguimiento del balón y del jugador en los deportes
- ¡Y muchos más!
Instalación de OpenCV con Python y Anaconda
OpenCV está escrito en C ++, pero es muy difícil implementarlo con C ++ y, por lo tanto, elegimos implementarlo con un lenguaje de alto nivel como python, y también hay beneficios adicionales de implementar OpenCV con python ya que Python es uno de los lenguajes más fáciles También para principiantes Es extremadamente poderoso para aplicaciones de ciencia de datos y aprendizaje automático y también almacena imágenes en matrices numerosas, lo que nos permite realizar algunas operaciones muy poderosas con bastante facilidad.
La programación básica es útil con Exposure to High School Level Math, una cámara web, Python 2.7 o 3.6 (se prefiere el paquete Anaconda).
Paso 1. Descargue e instale el paquete Anaconda Python
Vaya a: https://www.anaconda.com/download y elija de acuerdo con el clima de su máquina, su Windows, Linux o Mac y puede elegir la versión Python 2.7 o Python 3.7 para sistemas de 64 bits o sistemas de 32 bits, pero ahora al día, la mayoría de los sistemas son de 64 bits.
La distribución Anaconda de Python viene junto con Spyder Studio, los cuadernos jupyter y el indicador Anaconda, lo que hace que Python sea muy fácil de usar. Utilizaríamos Spyder Studio para hacer los ejemplos.
La elección entre python 2.7 o 3.7 es completamente neutral, pero sin embargo para los ejemplos estaríamos usando python 3.7 ya que es el futuro de python y asumirá el control de python 2.7 desde 2020, también la mayoría de las bibliotecas se están desarrollando en python 3.7 manteniendo el aspecto futuro de Python en mente. Además, también da los resultados esperados en operaciones matemáticas básicas como (2/5 = 2.5), mientras que python 2.7 lo evaluaría como 2. También print se trata como una función en python 3.7 (print ("hola")), por lo que les da la mano a los programadores.
Paso 2. Creando una plataforma virtual con OpenCV
Vamos a instalar OpenCV creando una plataforma virtual para spyder usando el indicador de Anaconda y el archivo YML cargado aquí.
Con los archivos YML instalaremos todos los paquetes y bibliotecas que serían necesarios, pero sin embargo, si desea instalar cualquier paquete adicional, puede instalarlo fácilmente a través del indicador de anaconda, ejecutando el comando de ese paquete.
Vaya al ícono de búsqueda de Windows y busque el terminal de solicitud de anaconda, puede encontrarlo dentro de la carpeta anaconda que acaba de instalar.
Luego debe encontrar su archivo YML descargado, y desde aquí tiene dos opciones: cambiar el directorio de su terminal a la ubicación donde se descarga su archivo YML o copiar su archivo YML al directorio donde está instalada su anaconda en la mayoría de los casos. casos estaría dentro de C: \ unidad, después de copiar su archivo YML a la ubicación especificada, EJECUTE el siguiente comando en su indicador
conda env create –f virtual_platform_windows.yml
Dado que mi sistema se ejecuta en Windows, el archivo YML y el comando corresponde a Windows, sin embargo, puede modificarlo de acuerdo con su sistema reemplazando Windows por Linux o Mac según corresponda.
Nota: - Si la extracción del paquete da un error, instale pytorch y numpy primero y luego ejecute el comando anterior.
Ahora busque el navegador anaconda y habrá un menú desplegable de "Aplicaciones en ___" y desde allí seleccione el entorno virtual y luego desde allí debe iniciar Spyder studio.
Y eso es todo, ¡estás listo para comenzar!
Abrir y guardar imágenes en OpenCV
Aquí explicamos algunos comandos básicos y terminología para usar Python en OpenCV. Aprenderemos sobre tres funciones básicas en OpenCV imread, imshow e imwrite.
# los comentarios en Python están dados por # símbolo
Importar opencv en python por comando
importar cv2
Cargue una imagen usando 'imread' especificando la ruta a la imagen
imagen = cv2.imread ('input.jpg')
Ahora esa imagen está cargada y almacenada en Python como una variable que nombramos como imagen
Ahora, para mostrar nuestra variable de imagen, usamos 'imshow' y el primer parámetro para la función imshow es el título que se muestra en la ventana de la imagen, y debe ingresarse en ('') para representar el nombre como una cadena
cv2.imshow ('hola mundo', imagen)
waitkey nos permite ingresar información cuando la ventana de la imagen está abierta, dejándola en blanco, simplemente espera a que se presione cualquier tecla antes de continuar, colocando números (excepto 0), podemos especificar un retraso por cuánto tiempo mantiene la ventana abierta (tiempo en milisegundos aquí).
cv2.waitKey ()
'destroyAllWindows' cierra todas las ventanas abiertas; si no lo coloca, el programa se bloqueará.
cv2.destroyAllWindows ()
, para esto usaremos numpy, numpy es una biblioteca para programación de Python para agregar soporte a grandes matrices y matrices multidimensionales.
import cv2 #importing numpy import numpy as np image = cv2.imread ('input.jpg') cv2.imshow ('hello_world', image) La función #shape es muy útil cuando estamos mirando las dimensiones de una matriz, devuelve una tupla que da una dimensión de una imagen print (image.shape) cv2.waitKey () cv2.destroyAllWindows ()
salida de la consola - (183, 275, 3), Las dos dimensiones de la imagen son 183 píxeles de alto y 275 píxeles de ancho y 3 significa que hay otros tres componentes (R, G, B) que hacen esta imagen (muestra que las imágenes coloreadas se almacenan en matrices tridimensionales).
print ('Alto de la imagen:', (imagen.forma, 'píxeles')) imprimir ('Ancho de la imagen:', (imagen.forma, 'píxeles'))
salida de la consola - Altura de la imagen: (183, 'píxeles')
Ancho de la imagen: (275, 'píxeles')
Guardar la imagen editada en OpenCV
Usamos 'imwrite' para especificar el nombre del archivo y la imagen que se guardará.
cv2.imwrite ('salida.jpg', imagen) cv2.imwrite ('salida.png', imagen)
El primer argumento es el nombre del archivo que queremos guardar, {para leer o guardar el archivo que usamos ('') para indicarlo como una cadena} y el segundo argumento es el nombre del archivo.
OpenCV te permite guardar la imagen en diferentes formatos.
Imagen de escala de grises en OpenCV
La escala de grises es el proceso mediante el cual una imagen se convierte de un color completo a tonos de gris (blanco y negro)
En opencv, muchas funciones escalan en gris las imágenes antes de procesarlas. Esto se hace porque simplifica la imagen, actuando casi como una reducción de ruido y aumentando el tiempo de procesamiento ya que hay menos información en la imagen (ya que las imágenes en escala de grises se almacenan en matrices bidimensionales).
import cv2 # carga nuestra imagen de entrada image = cv2.imread ('input.jpg') cv2.imshow ('original', image) cv2.waitKey () # usamos cvtcolor, para convertir a escala de grises gray_image = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('escala de grises', imagen_gris) cv2.waitKey () cv2.destroyALLWindows ()
Una forma más sencilla de convertir una imagen en escala de grises es simplemente agregar el argumento 0 en la función imread a un lado del nombre de la imagen
importar cv2 grey_image = cv2.imread ('input.jpg', 0) cv2.imshow ('grayscale', 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 () gray_image = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('escala de grises', imagen_gris) print (imagen_gris.forma) cv2.waitKey () cv2.destroyALLWindows ()
Salida de consola: - (183, 275, 3) - para imagen en color
(183, 275) - para imagen en escala de grises
Por lo tanto, muestra claramente que las imágenes en color están representadas por matrices tridimensionales, mientras que las imágenes en escala de grises por matrices bidimensionales.
Espacios de color
Los espacios de color son la forma en que se almacenan las imágenes. RGB, HSV, CMYK son los diferentes espacios de color, estas son solo formas simples de representar el color.
RGB: rojo, verde y azul.
HSV: matiz, saturación y valor.
Y CMYK se usa comúnmente en impresoras de inyección de tinta.
Espacio de color RGB o BGR
El espacio de color predeterminado de OpenCV es RGB. RGB es un modelo de color aditivo que genera colores combinando colores azul, verde y rojo de diferentes intensidades / brillo. En OpenCV utilizamos profundidades de color de 8 bits.
- Rojo (0-255)
- Azul (0-255)
- Verde (0-255)
Sin embargo, OpenCV en realidad almacena el color en formato BGR.
Dato curioso: - Usamos el orden BGR en las computadoras debido a la forma en que los enteros de 32 bits sin firmar se almacenan en la memoria, aún así termina almacenándose como RGB. El número entero que representa un color, por ejemplo: - 0X00BBGGRR se almacenará como 0XRRGGBB.
Espacio de color HSVHSV (tono, saturación y valor / brillo) es un espacio de color que intenta representar los colores que los humanos perciben. Almacena información de color en una representación cilíndrica de puntos de color RGB.
Matiz - valor de color (0-179)
Saturación - Intensidad del color (0-255)
Valor: brillo o intensidad (0-255)
El formato de espacio de color HSV es útil en la segmentación de color. En RGB, filtrar un color específico no es fácil, sin embargo, HSV hace que sea mucho más fácil establecer rangos de color para filtrar un color específico tal como lo percibimos.
El tono representa el color en HSV, el valor de tono varía de 0 a 180 y no de 360, por lo que no completa el círculo completo y, por lo tanto, se asigna de manera diferente al estándar.
Filtros de gama de colores
- Rojo - (165-15)
- Verde - (45-75)
- Azul - (90-120)
Como sabemos, las imágenes se almacenan en el espacio de color RGB (rojo, verde y azul) y, por lo tanto, OpenCV nos muestra lo mismo, pero lo primero que debemos recordar sobre el formato RGB de opencv es que en realidad es BGR y podemos saberlo mirando el forma de la imagen.
import cv2 import numpy as np image = cv2.imread ('input.jpg') # Valor B, G, R para el primer píxel 0,0 B, G, R = image print (B, G, R) print (image.shape) #ahora si aplicamos esto en la imagen en escala de grises gray_img = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) print (gray_img.shape) #gray_image valor de píxel para impresión de 10,50 píxeles (gray_img)
Salida de consola: impresión (B, G, R) - 6 11 10
imprimir (imagen.forma) - (183, 275, 3)
imprimir (gray_img.shape) - (183, 275)
imprimir (gray_img) - 69
Ahora solo hay dos dimensiones en una imagen en escala de grises, ya que recordamos que la imagen en color está almacenada en tres dimensiones, siendo la tercera dimensión la (R, G, B) mientras que en escala de grises solo están presentes dos dimensiones, ya que (R, G, B) está ausente y para una posición de píxel en particular solo obtenemos un valor único mientras que en la imagen en color obtuvimos tres valores.
Otro espacio de color útil es 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ón', hsv_image) cv2.imshow ('canal de valor', hsv_image) cv2.waitKey () cv2.destroyAllWindows ()
Después de ejecutar el código, puede ver las cuatro imágenes de las cuales tres son de los canales individuales y una es una imagen de HSV combinada.
La imagen del canal de tono es bastante oscura porque su valor solo varía de 0 a 180.
Además, tenga en cuenta que la función imshow intenta mostrarle la imagen RGB o BGR, pero la conversión HSV la superpone.
Además, el canal de valor será similar a la escala de grises de la imagen debido a su brillo.
Explorando componentes individuales de la imagen RGB
import cv2 image = cv2.imread ('input.jpg') # la función split de opencv divide la imagen en cada índice de color B, G, R = cv2.split (imagen) cv2.imshow ("Red", R) cv2.imshow ("Green", G) cv2.imshow ("Blue", B) #haciendo la imagen original fusionando los componentes de color individuales merged = cv2.merge () cv2.imshow ("merged", merged) #amplificando el color azul combinado = cv2.merge () cv2.imshow ("fusionado con amplificar azul", fusionado) #representando la forma de los componentes de color individuales. # la salida sería solo de dos dimensiones, que serían la altura y el ancho, ya que el tercer elemento del componente RGB se representa individualmente print (B.shape) print (R.forma) imprimir (G.shape) cv2.waitKey (0) cv2.destroyAllWindows ()
Salida de la consola: #dimensions of image from shape function
(183, 275)
(183, 275)
(183, 275)
Conversión de imagen en componente RGB individual
En el siguiente código, hemos creado una matriz de ceros con las dimensiones de la imagen HxW, cero devuelve una matriz llena de ceros pero con las mismas dimensiones.
La función de forma es muy útil cuando miramos la dimensión de una imagen, y aquí hemos hecho el corte de esa función de forma. Entonces, la forma tomaría todo hasta los puntos designados, es decir, hasta el segundo punto designado, que sería la altura y el ancho de la imagen, ya que el tercero representa el componente RGB de la imagen y no lo necesitamos aquí.
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 ("ROJO", cv2.merge ()) cv2.imshow ("Verde", cv2.merge ()) cv2.imshow ("Azul", cv2.merge ()) cv2.waitKey (0) cv2.destroyAllWindows ()
Representación de histograma de imagen
La representación de histograma de la imagen es el método de visualizar los componentes de las imágenes.
El siguiente código le permite analizar la imagen a través del histograma de color de sus componentes de color combinados e individuales.
import cv2 import numpy as np # necesitamos importar matplotlib para crear gráficos de histograma import matplotlib.pyplot as plt image = cv2.imread ('input.jpg') histogram = cv2.calcHist (,, None,,) # trazamos un histograma, ravel () aplana nuestra matriz de imágenes plt.hist (image.ravel (), 256,) plt.show () #ver canales de color separados color = ('b', 'g', 'r') # sabemos separe el color y trace cada uno en el histograma para i, col en enumerate (color): histogram2 = cv2.calcHist (,, None,,) plt.plot (histogram2, color = col) plt.xlim () plt.show ()
Vamos a entender la calcHist función con cada uno de sus parámetros individuales
cv2.calcHist (imágenes, canales, máscara, histsize , rangos)
Imágenes: es la imagen de origen de tipo uint 8 o float 32. Debe estar entre corchetes, es decir, “”, que también indica su matriz de segundo nivel, ya que una imagen para opencv son datos en forma de matriz.
Canales: también se da entre corchetes. Es el índice de canal para el que calculamos histograma, por ejemplo si la entrada es imagen en escala de grises su valor es, para imágenes en color se puede pasar, o para calcular histograma de canal azul, verde y rojo respectivamente.
Máscara: imagen de máscara. para encontrar el histograma de imagen completa, se da como "ninguno". pero si desea encontrar el histograma de una región particular de la imagen, debe crear una imagen de máscara para eso y darla como máscara.
Histsize: Esto representa nuestro recuento de BIN. Es necesario que se indique entre corchetes para aprobar la escala completa.
Rangos: Este es nuestro rango, normalmente es
Dibujar imágenes y formas usando OpenCV
A continuación se muestran algunos ejemplos para dibujar líneas, rectángulos, polígonos, círculos, etc. en OpenCV.
import cv2 import numpy as np #creating a black square image = np.zeros ((512,512,3), np.uint8) # también podemos crear esto en blanco y negro, sin embargo, no habría ningún cambio image_bw = np.zeros ((512,512), np.uint8) cv2.imshow ("rectángulo negro (color)", imagen) cv2.imshow ("rectángulo negro (blanco y negro)", imagen_bw)
Línea
#crea una línea sobre un cuadrado negro # cv2.line (imagen, coordenadas iniciales, coordenadas finales, color, grosor) # dibuja una línea diagonal de grosor 5 píxeles image = np.zeros ((512,512,3), np.uint8) cv2.line (imagen, (0,0), (511,511), (255,127,0), 5) cv2.imshow ("línea azul", imagen)
Rectángulo
#crear un rectángulo sobre un cuadrado negro # cv2.rectangle (imagen, coordenadas iniciales, coordenadas finales, color, grosor) #dibujar un rectángulo de 5 píxeles de grosor image = np.zeros ((512,512,3), np.uint8) cv2.rectangle (imagen, (30,50), (100,150), (255,127,0), 5) cv2.imshow ("rectángulo", imagen)
Circulo#creando un círculo sobre un cuadrado negro # cv2.circle (imagen, centro, radio, color, relleno) imagen = np.zeros ((512,512,3), np.uint8) cv2.circle (imagen, (100,100), (50), (255,127,0), - 1) cv2.imshow ("círculo", imagen)
Polígono#creando una imagen de polígono = np.zeros ((512,512,3), np.uint8) # permite definir cuatro puntos pts = np.array (,,,], np.int32) # ahora remodelar nuestros puntos en la forma requerida por polilíneas pts = pts.reshape ((- 1,1,2)) cv2.polylines (image`` True, (0,255,255), 3) cv2.imshow ("polygon", image)
Texto# ingresando texto usando opencv # cv2.putText (imagen, 'texto para mostrar', punto de inicio izquierdo del bootom, fuente, tamaño de fuente, color, grosor) image = np.zeros ((512,512,3), np.uint8) cv2. putText (imagen, "hola mundo", (75,290), cv2.FONT_HERSHEY_COMPLEX, 2, (100,170,0), 3) cv2.imshow ("hola mundo", imagen) cv2.waitKey (0) cv2.destroyAllWindows ()
Computer Vision y OpenCV son temas muy amplios para cubrir, pero esta guía sería un buen punto de partida para aprender OpenCV y el procesamiento de imágenes.