Guía de desarrollo de OpenCV-Python (12) --- Affine of Geometric Transformation

Tabla de contenido

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:

Fórmula afín
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:

METRO

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:
imagen

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:
imagen

Supongo que te gusta

Origin blog.csdn.net/liyuanjinglyj/article/details/113802561
Recomendado
Clasificación