OpenCV es una de las bibliotecas de visión artificial más populares. Si desea comenzar su viaje en el campo de la visión por computadora, es de suma importancia una comprensión profunda de los conceptos de OpenCV.
En este artículo intentaré introducir los conceptos más básicos e importantes de OpenCV de forma intuitiva.
Este artículo cubrirá los siguientes temas:
- leyendo una imagen
- Extrayendo los valores RGB de un píxel
- Extracción de la región de interés (ROI)
- Cambiar el tamaño de la imagen
- Rotación de la imagen
- dibujar un rectángulo
- Mostrar texto
Esta es la imagen original que manipularemos a lo largo de este artículo.
Comencemos con la simple tarea de leer una imagen usando OpenCV.
leyendo una imagen
# Importing the OpenCV library import cv2 # Reading the image using imread() function image = cv2.imread('image.png') # Extracting the height and width of an image h, w = image.shape[:2] # Displaying the height and width print("Height = {}, Width = {}".format(h, w))
Ahora nos centraremos en extraer los valores RGB de un píxel individual.
Nota: OpenCV organiza los canales en orden BGR. Entonces, el valor 0 corresponderá al píxel azul y no al rojo.
Extrayendo los valores RGB de un píxel
# Extracting RGB values. # Here we have randomly chosen a pixel # by passing in 100, 100 for height and width. (B, G, R) = image[100, 100] # Displaying the pixel values print("R = {}, G = {}, B = {}".format(R, G, B)) # We can also pass the channel to extract # the value for a specific channel B = image[100, 100, 0] print("B = {}".format(B))
Extracción de la región de interés (ROI)
# We will calculate the region of interest # by slicing the pixels of the image roi = image[100 : 500, 200 : 700]
Cambiar el tamaño de la imagen
# resize() function takes 2 parameters, # the image and the dimensions resize = cv2.resize(image, (800, 800))
El problema con este enfoque es que no se mantiene la relación de aspecto de la imagen. Por lo tanto, debemos hacer un trabajo adicional para mantener una relación de aspecto adecuada.
# Calculating the ratio ratio = 800 / w # Creating a tuple containing width and height dim = (800, int(h * ratio)) # Resizing the image resize_aspect = cv2.resize(image, dim)
Rotación de la imagen
# Calculating the center of the image center = (w // 2, h // 2) # Generating a rotation matrix matrix = cv2.getRotationMatrix2D(center, -45, 1.0) # Performing the affine transformation rotated = cv2.warpAffine(image, matrix, (w, h))
Hay muchos pasos involucrados en la rotación de una imagen. Entonces, permítanme explicar cada uno de ellos en detalle.
Las 2 funciones principales utilizadas aquí son:
- getRotationMatrix2D()
- deformación afín()
getRotationMatrix2D()
Toma 3 argumentos –
- center – Las coordenadas del centro de la imagen
- Ángulo: el ángulo (en grados) por el cual se debe rotar la imagen
- Escala – El factor de escala
Devuelve una array de 2*3 que consta de valores derivados de alfa y beta
alfa = escala * cos (ángulo)
beta = escala * seno (ángulo)
deformación afín()
La función warpAffine transforma la imagen de origen utilizando la array de rotación:
dst(x, y) = src(M11X + M12Y + M13, M21X + M22Y + M23)
Aquí M es la array de rotación, descrita anteriormente.
Calcula nuevas coordenadas x, y de la imagen y las transforma.
Dibujar un rectángulo
Es una operación in situ.
# We are copying the original image, # as it is an in-place operation. output = image.copy() # Using the rectangle() function to create a rectangle. rectangle = cv2.rectangle(output, (1500, 900), (600, 400), (255, 0, 0), 2)
Toma 5 argumentos –
- Imagen
- Coordenadas de la esquina superior izquierda
- Coordenadas de la esquina inferior derecha
- Color (en formato BGR)
- Ancho de línea
Mostrar texto
También es una operación in situ
# Copying the original image output = image.copy() # Adding the text using putText() function text = cv2.putText(output, 'OpenCV Demo', (500, 550), cv2.FONT_HERSHEY_SIMPLEX, 4, (255, 0, 0), 2)
Toma 7 argumentos –
- Imagen
- Texto a mostrar
- Coordenadas de la esquina inferior izquierda, desde donde debe comenzar el texto
- Fuente
- Tamaño de fuente
- Color (formato BGR)
- Ancho de línea