[OpenCV-Python] 14 Transformación geométrica

OpenCV-Python: Procesamiento de imágenes IV en OpenCV

14 Transformación geométrica

Objetivos:
  • Aprender a realizar diversas transformaciones en imágenes, como movimiento, rotación, transformación afín, etc.
  • La función a aprender es: cv2.getPerspectiveTransform.

Transformación:
OpenCV proporciona dos funciones de transformación, cv2.warpAffine y cv2.warpPerspective, usando estas dos funciones puedes implementar todo tipo de transformaciones. El parámetro recibido por cv2.warpAffine es una matriz de transformación de 2 × 3, mientras que el parámetro recibido por cv2.warpPerspective es una matriz de transformación de 3 × 3.

14.1 Zoom extendido

Ampliar zoom solo cambia el tamaño de la imagen. La función cv2.resize () proporcionada por OpenCV puede lograr esta función. El tamaño de la imagen puede configurarse manualmente usted mismo y también puede especificar el factor de zoom. Podemos optar por utilizar diferentes métodos de interpolación. Recomendamos usar cv2.INTER_AREA al escalar, y recomendamos usar v2.INTER_CUBIC (lento) y v2.INTER_LINEAR al expandir. De forma predeterminada, el método de interpolación utilizado para todas las operaciones que cambian el tamaño de la imagen es cv2.INTER_LINEAR. Puede utilizar cualquiera de los siguientes métodos para cambiar el tamaño de la imagen:

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')
# 下面的 None 本应该是输出图像的尺寸,但是因为后边我们设置了缩放因子
# 因此这里为 None
res=cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
#OR
# 这里呢,我们直接设置输出图像的尺寸,所以不用设置缩放因子
height,width=img.shape[:2]
res=cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC)
while(1):
    cv2.imshow('res',res)
    cv2.imshow('img',img)
    if cv2.waitKey(1) & 0xFF == 27:
        break
cv2.destroyAllWindows()
# Resize(src, dst, interpolation=CV_INTER_LINEAR)

14.2 Pan

La traducción consiste en cambiar la posición del objeto. Si desea moverse en la dirección (x, y) y la distancia para moverse es (tx, ty), puede construir la matriz de movimiento de la siguiente manera:

Inserte la descripción de la imagen aquí

Puede construir esta matriz usando una matriz Numpy (el tipo de datos es np.float32) y luego pasarla a la función cv2.warpAffine (). Eche un vistazo al siguiente ejemplo, se ha movido (100,50) píxeles.

import cv2
import numpy as np

img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape

M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

img

Advertencia: El tercer parámetro de la función cv2.warpAffine () es el tamaño de la imagen de salida y su formato debe ser la imagen (ancho, alto). Debe recordarse que el ancho de la imagen corresponde al número de columnas y la altura corresponde al número de filas.
Aquí está el resultado:

14.3 Rotación

Para un ángulo de rotación de imagen θ, se debe utilizar la siguiente forma de matriz de rotación.
      M = \ begin {bmatrix} cos \ theta & -sin \ theta \ sin \ theta & cos \ theta \ end {bmatrix}
Pero OpenCV le permite rotar en cualquier lugar, pero la forma de la matriz de rotación debe modificarse
para
      

Entre ellos:
      \ begin {matriz} {l} \ alpha = escala \ cdot \ cos \ theta, \ \ beta = escala \ cdot \ sin \ theta \ end {matriz}
Para construir esta matriz de rotación, OpenCV proporciona una función: cv2.getRotationMatrix2D.
El siguiente ejemplo es rotar la imagen 90 grados sin hacer zoom.

import cv2
import numpy as np
img=cv2.imread('messi5.jpg',0)
rows,cols=img.shape
# 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
# 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题
M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6)
# 第三个参数是输出图像的尺寸中心
dst=cv2.warpAffine(img,M,(2*cols,2*rows))
while(1):
    cv2.imshow('img',dst)
    if cv2.waitKey(1)&0xFF==27:
        break
cv2.destroyAllWindows()   

Aquí está el resultado:

14.4 Transformación afina

En la transformación afín, todas las líneas paralelas de la imagen original también son paralelas en la imagen de resultado. Para crear esta matriz, necesitamos encontrar tres puntos de la imagen original y sus posiciones en la imagen de salida. Entonces cv2.getAffineTransform creará una matriz 2x3, y finalmente esta matriz se pasará a la función cv2.warpAffine.
Echemos un vistazo al siguiente ejemplo y los puntos que seleccioné (los puntos marcados en verde)

img = cv2.imread('drawing.png')
rows,cols,ch = img.shape

pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])

M = cv2.getAffineTransform(pts1,pts2)

dst = cv2.warpAffine(img,M,(cols,rows))

plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

Aquí está el resultado:

14.5 Transformación de perspectiva

Para la transformación del ángulo de visión, necesitamos una matriz de transformación de 3x3. La línea recta sigue siendo recta antes y después de la transformación. Para construir esta matriz de transformación, necesita encontrar 4 puntos en la imagen de entrada y sus posiciones correspondientes en la imagen de salida. Tres de estos cuatro puntos no pueden ser colineales. Esta matriz de transformación se puede construir con la función cv2.getPerspectiveTransform (). Luego pase esta matriz a la función cv2.warpPerspective.
el código se muestra a continuación:

img = cv2.imread('sudokusmall.png')
rows,cols,ch = img.shape

pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])

M = cv2.getPerspectiveTransform(pts1,pts2)

dst = cv2.warpPerspective(img,M,(300,300))

plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

Los resultados son los siguientes:

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo anti-hotlinking. Se recomienda guardar la imagen y subirla directamente (img-JZdb8x9w-1611974598281) (http://opencv-python-tutroals.readthedocs.io / es / latest / _images /perspective.jpg)]
Para obtener más información, preste atención a la cuenta oficial:
img

Supongo que te gusta

Origin blog.csdn.net/yegeli/article/details/113417730
Recomendado
Clasificación