- 1. Transformaciones de imágenes: transformación afín y no afín
- 2. Traducciones de imágenes: mover la imagen hacia arriba, abajo, izquierda y derecha
- 3. Rotación de la imagen: girar la imagen
- 4. Escalado, cambio de tamaño e interpolación
- 5. Pirámides de imágenes: otra forma de cambiar el tamaño
- 6. Recorte: recorta la región de la imagen que desee.
- 7. Operaciones aritméticas para aclarar y oscurecer imágenes
En el tutorial anterior, hemos aprendido acerca de OpenCV y hecho alguna imagen básicas de procesamiento de usarlo como escala gris, saturación de color, histograma, espacios de color, componente RGB etc. Como dijo en el tutorial anterior, OpenCV es Open Source de cercanías Biblioteca visión que 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 la Raspberry Pi con OpenCV y la 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.
En este tutorial, veremos cómo vamos a manipular la imagen usando OpenCV. Aquí aprenderemos a aplicar la siguiente función en una imagen usando OpenCV:
- Transformaciones de imagen: transformación afín y no afín
- Traducciones de imágenes: mover la imagen hacia arriba, abajo, izquierda y derecha
- Rotación de imagen: girar la imagen
- Escalado, cambio de tamaño e interpolación
- Pirámides de imagen: otra forma de cambiar el tamaño
- Recortar: recortar la región de la imagen que desee
- Operaciones aritméticas para aclarar y oscurecer imágenes
1. Transformaciones de imágenes: transformación afín y no afín
Las transformaciones son distorsiones geométricas representadas sobre una imagen, las distorsiones ciertamente aquí no significan errores, sino un tipo de corrección para corregir los problemas de perspectiva que surgen del punto donde se capturó la imagen. Hay dos tipos de transformaciones de imágenes : afines y no afines
Las transformaciones afines son de tres tipos: escalado, rotación y traslación, lo importante en las transformaciones afines es que las líneas son paralelas antes y después de las transformaciones de la imagen.
Las transformaciones no afines o las transformaciones proyectivas no preservan el paralelismo, la longitud o el ángulo, sin embargo preservan la colinealidad y la incidencia, colinealidad significa que los dos puntos se encuentran en la misma línea recta.
Las transformaciones no afines son muy comunes en la visión por computadora y se generan desde diferentes ángulos de cámara. Las transformaciones no afines o proyectivas también se denominan homografía.
2. Traducciones de imágenes: mover la imagen hacia arriba, abajo, izquierda y derecha
La traducción de imágenes es mover la imagen hacia arriba, hacia abajo, hacia la izquierda y hacia la derecha e incluso en diagonal si implementamos la traducción xey al mismo tiempo.
Ahora para realizar traducciones de imágenes usamos la función warpAffine de opencv, cv2.warpAffine se usa para implementar estas traducciones pero para eso necesitamos una matriz de traducción.
Matriz de traducción, T = 1 0 Tx
0 1 ty
T X, T y son las direcciones en las que se produce el cambio de imagen.
Donde la T X se desplaza a lo largo del eje X (horizontal)
T Y es desplazamiento a lo largo del eje Y (vertical)
# esta es una transformación afín que simplemente cambia la posición de una imagen # usamos cv2.warpAffine para implementar estas transformaciones. importar cv2 importar numpy as np image = cv2.imread ('input.jpg') # almacenar la altura y el ancho de la imagen height, width = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (imagen, T, (ancho, alto)) print (T) cv2.imshow ('original_image', image) cv2.waitKey (0) cv2.imshow (' Traducción ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Salida de consola - (183, 275) - alto y ancho
- Matriz T
]
3. Rotación de la imagen: girar la imagen
La rotación de la imagen consiste en rotar una imagen sobre un punto o el punto en el centro de la imagen, al igual que el punto de rotación actúa como un pivote.
Como en traslación tenemos una matriz T, probablemente en rotación tenemos una matriz M
Matriz de rotación, matriz M = Cosθ -Sinθ
Sinθ Cosθ
Donde θ es el ángulo de rotación, medido en sentido antihorario.
También hay una cosa a tener en cuenta que OpenCV le permite vender y rotar imagen al mismo tiempo usando la función, cv2.getRotationMatrix2D (rotacion_centro_x, rotacion_centro_y, ángulo de rotacion, escala)
Todavía usamos la función warpAffine de opencv para obtener la rotación de la imagen, pero en lugar de la matriz de traducción como en el caso anterior aquí usamos la matriz de rotación.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape #divide la altura y el ancho por 2 para rotar la imagen sobre su centro rotacion_matriz = cv2.getRotationMatrix2D ((ancho / 2, altura / 2), 90,1) rotated_image = cv2.warpAffine (imagen, rotacion_matriz, (ancho, alto)) cv2.imshow ('imagen original', imagen) cv2.waitKey (0) cv2.imshow ('imagen rotada ', imagen_ rotada) cv2.waitKey (0) cv2.destroyAllWindows ()
Ahora la imagen se gira 90 grados, se recorta debido al tamaño del lienzo, ya que el tamaño del lienzo sigue siendo el mismo, pero debido a la rotación, el tamaño de la imagen no se ajusta al tamaño del lienzo. Se puede ajustar estableciendo el factor de escala en negativo, pero permite un fondo negro detrás de la imagen.
Por lo tanto, puede establecer la altura y el ancho de la imagen anticipándose o adivinando, o hay otro método para rotar la imagen mediante la transposición, pero rotaría la imagen en múltiplos de 90 grados en el sentido contrario a las agujas del reloj.
4. Escalado, cambio de tamaño e interpolación
Escalar y cambiar el tamaño son transformaciones afines, cambiar el tamaño de la imagen es lo que hemos hecho bastante tiempo y también nos hemos ocupado de la interpolación, como cuando se cambia el tamaño de la imagen a un tamaño mayor en el que estamos expandiendo los píxeles, hay algunos huecos en el píxeles y ahí es donde entra la interpolación.
Puede ocurrir al aumentar el tamaño de la imagen de menor a mayor o al disminuir el tamaño de la imagen de mayor a menor.
Técnicamente, la interpolación es un método para construir nuevos puntos de datos (píxeles), dentro de un conjunto discreto de puntos de datos conocidos.
Hay varios tipos de métodos de interpolación en OpenCV como
cv2.INTER_AREA - bueno para reducir o reducir el muestreo
cv2.INTER_NEAREST - más rápido
cv2.LINEAR: bueno para hacer zoom o aumentar el muestreo (predeterminado)
cv2.CUBIC - mejor
cv2.INTER_LANCZOS4 - mejor
# cambiar el tamaño es muy fácil usando la función cv2.resize, sus argumentos son # cv2.resize (image, dsize (tamaño de la imagen de salida), x_scale, y_scale, interpolation) import cv2 import numpy as np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', imagen) cv2.waitKey (0) # hagamos que la imagen sea 3/4 del tamaño de la imagen original, es decir, se reduzca al 75% image_scaled = cv2.resize (image, None, fx = 0,75, fy = 0,75) # dado que la interpolación lineal es el método predeterminado para el cv abierto, no es necesario implementarlo como una función. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # dupliquemos el tamaño de nuestra imagen img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # hagamos el cambio de tamaño por dimensiones exactas image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Pirámides de imágenes: otra forma de cambiar el tamaño
La imagen piramidal se refiere a la ampliación (ampliación de imágenes) o la reducción (reducción de imágenes).
Es simplemente una forma diferente de cambiar el tamaño que nos permite escalar imágenes de manera fácil y rápida, reduciendo la escala y reduciendo la altura y el ancho de la nueva imagen a la mitad.
Esto resulta útil cuando se hacen detectores de objetos que escalan las imágenes cada vez que buscan un objeto.
importar cv2 imagen = cv2.imread ('input.jpg') pequeño = cv2.pyrDown (imagen) grande = cv2.pyrUp (pequeño) cv2.imshow ('original', imagen) cv2.waitKey (0) cv2.imshow ('más pequeño', más pequeño) cv2.waitKey (0) cv2.imshow ('más grande', más grande) cv2.waitKey (0) cv2.destroyAllWindows ()
En una imagen más grande, notará que aún siendo del mismo tamaño que la imagen original, es un poco borrosa porque se convierte directamente de una imagen más pequeña a una imagen más grande. Pero si lo interpolamos la calidad de la imagen mejora con respecto a la anterior porque la interpolación estima los píxeles al tiempo que rellena los espacios cuando se amplía la imagen.
Ahora, ejecutar el mismo código pero con interpolación cúbica proporciona una mejor calidad de imagen grande. Las siguientes imágenes muestran la comparación entre la imagen original, la versión ampliada de la imagen, la imagen más pequeña y la versión cúbica interpolada de la imagen más pequeña.
importar cv2 imagen = cv2.imread ('input.jpg') pequeño = cv2.pyrDown (imagen) grande = cv2.pyrUp (pequeño) cv2.imshow ('original', imagen) cv2.waitKey (0) cv2.imshow ('más pequeño', más pequeño) cv2.waitKey (0) cv2.imshow ('más grande', más grande) cv2.waitKey (0) # aumentando la calidad de la imagen convertida más grande a partir de una imagen más pequeña usando interpolación cúbica img_double = cv2.resize (más pequeño, Ninguno, fx = 2, fy = 2, interpolación = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
NOTA: Si desea crear múltiples copias pequeñas de imágenes cada vez más pequeñas o múltiples copias grandes de imágenes que crecen continuamente en tamaño, entonces podemos usarbucles for o while que se mantienen dentro de la función pyrDown o pyrUp .
6. Recorte: recorta la región de la imagen que desee.
Recortar imágenes se refiere a extraer un segmento de imagen.
OpenCV directamente no tiene función de recorte, pero se puede hacer fácilmente con numpy usando el siguiente código
Recortada = imagen
Ponemos la matriz de imágenes y usando herramientas de indexación o método en numpy, definimos fila de inicio a fila final y columna de inicio a columna final separados por una coma que extrae el rectángulo que queremos recortar para obtener la imagen.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape # obtengamos las coordenadas de píxeles de inicio (arriba a la izquierda del rectángulo de recorte) start_row, start_col = int (height *.25), int (ancho *.25) # obtengamos las coordenadas de píxeles finales (abajo a la derecha) end_row, end_col = int (alto *.75), int (ancho *.75) #simplemente use la indexación para recortar el rectángulo que deseamos recortado = imagen cv2.imshow ("imagen original", imagen) cv2.waitKey (0) cv2.imshow ("imagen recortada", recortada) cv2.waitKey (0) cv2.destroyAllWindows ()
Tenga en cuenta que puede usar valores de píxeles directamente en lugar de start_col o start_row , solo se proporcionan para que el usuario pueda identificarlos fácilmente.
7. Operaciones aritméticas para aclarar y oscurecer imágenes
Las operaciones aritméticas en OpenCV básicamente son sumar o restar matrices a la imagen, sumar o restar matrices tiene efecto sobre el aumento o la disminución del brillo.
Entonces, para sumar o restar matrices, tenemos que crearlas y numpy tiene una función llamada np.ones que da matrices del mismo tamaño de 1 que nuestra imagen.
import cv2 import numpy as np image = cv2.imread ('input.jpg') #crear una matriz de uno, luego multiplicarla por un escalador de 100 ' # np.ones da una matriz con la misma dimensión que nuestra imagen con todos los valores son 100 en este caso M = np.ones (image.shape, dtype = "uint8") * 100 # usamos esto para agregar esta matriz M a nuestra imagen # observe el aumento de brillo agregado = cv2.add (image, M) cv2.imshow ("Agregado", agregado) cv2.waitKey (0) # de la misma manera también podemos restar #nota la disminución del brillo restado = cv2.subtract (imagen, M) cv2.imshow ("restado", restado) cv2.waitKey (0) cv2.destroyAllWindows ()
Así es como OpenCV se puede utilizar para aplicar muchas operaciones de procesamiento de imágenes diferentes en la imagen. Continuaremos con otras funciones de manipulación de imágenes en el próximo tutorial.