Afín
En OpenCV, la transformación afín se refiere a una serie de transformaciones geométricas para lograr traslación, rotación y otras operaciones. Esta transformación puede mantener la rectitud y el paralelismo de la imagen. Rectitud significa que después de que la imagen sufre una transformación afín, la línea recta sigue siendo una línea recta; el paralelismo significa que la imagen sigue siendo paralela después de que se completa la transformación afín.
En OpenCV, la función afín que nos proporciona es cv2.warpAffine (), que se implementa mediante una matriz de transformación M. Si no sabe mucho sobre operaciones matriciales, puede recordar lo que se explicará más adelante, o puede aprender discreto matemáticas o álgebra lineal. Ambos han explicado las operaciones matriciales.
La definición de la función afín es la siguiente:
def warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None):
src: representa la imagen original para ser afín
M: Representa una matriz de transformación de 2 * 3. Usando diferentes matrices de transformación, se pueden realizar diferentes transformaciones afines.
dszie: representa el tamaño de la imagen de salida.
dst: representa la imagen de salida después de afín
banderas: representa el método de interpolación, el predeterminado es INTER_LINEAR. Cuando el valor es WARP_INVERSE_MAP, significa que M es un tipo de transformación inversa, que implementa la transformación inversa de la imagen de destino dst a la imagen original src. Parámetros detallados, la tabla de publicaciones del blog anterior es.
borderMode: representa el tipo de borde, el predeterminado es BORDER_CONSTANT. Cuando el valor es BORDER_TRANSPARENT, significa que los valores de la imagen de destino no se cambiarán y estos valores corresponden a los valores anormales de la imagen original.
borderValue: representa el valor del borde, el valor predeterminado es 0.
En resumen, nuestros parámetros de uso común son: src, M, dsize.
Sartén
La fórmula afín conocida es:
Supongamos que ahora queremos mover la imagen 50 píxeles hacia la derecha y 100 píxeles hacia la parte inferior, luego la fórmula después del reemplazo es la siguiente:
dst (x, y) = src (x + 50, y + 100)
dst (x, y) = src (1 x, + 0 y + 50,0 x + 1 y + 100)
Obtenga el valor de cada elemento en M:
M11 = 1
M12 = 0
M13 = 50
M21 = 0
M22 = 1
M23 = 100
En resumen, la matriz de transformación para desplazarse hacia la derecha 50 píxeles y desplazarse hacia abajo 100 píxeles es:
Conociendo la matriz de transformación y la imagen original, podemos completar la operación de traducción de la imagen de forma muy sencilla. El código específico es el siguiente:
import cv2
import numpy as np
img = cv2.imread("4.jpg")
h, w = img.shape[:2]
x = 50
y = 100
M = np.float32([[1, 0, x], [0, 1, y]])
move_img = cv2.warpAffine(img, M, (w, h))
cv2.imshow("img", img)
cv2.imshow("move_img", move_img)
cv2.waitKey()
cv2.destroyAllWindows()
Después de ejecutar, el efecto es el siguiente:
Vuelta
Cuando se usa la función cv2.warpAffine () para rotar la imagen, la matriz de conversión se puede obtener mediante la función cv2.getRotationMatrix2D (). El formato de sintaxis de esta función es:
def getRotationMatrix2D (centro, ángulo, escala):
centro: es el centro de rotación
ángulo: el ángulo de rotación, un número positivo significa rotación en sentido antihorario y un número negativo significa rotación en sentido horario
escala: es el tamaño de transformación (es decir, el tamaño de zoom mencionado anteriormente)
A continuación, rotemos la imagen de arriba 45 grados, el código específico es el siguiente:
import cv2
img = cv2.imread("4.jpg")
h, w = img.shape[:2]
M = cv2.getRotationMatrix2D((w / 2, h / 2), 45, 0.6)
move_img = cv2.warpAffine(img, M, (w, h))
cv2.imshow("img", img)
cv2.imshow("move_img", move_img)
cv2.waitKey()
cv2.destroyAllWindows()
Simplemente cambie la matriz de transformación M, donde (w / 2, h / 2) es la coordenada central de la imagen, 45 es un número positivo, es decir, gire 45 grados en sentido antihorario y 0.6 es para ampliar la imagen 0.6 veces.
Después de ejecutar, el efecto es el siguiente: