Transformación del espacio geométrico opencv: cambiar tamaño (), transponer (), voltear (), warpAffine (), rotar (), warpPerspective ()

1. Escalar resize ()
resize() puede reducir o ampliar el tamaño de la imagen.
dst=cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
src: imagen de origen;
dsize: el tamaño de la imagen de destino después del escalado. Si se establece en 0, la imagen de destino se obtiene multiplicando el tamaño de la imagen de origen por fx y fy; dsize tiene prioridad. El nivel es superior a fx y fy. Si se establece dsize, las configuraciones posteriores de fx y fy no son válidas; fx
y fy: cuando no se establece dsize, fx y fy se utilizan como factores de ampliación del ancho y altura respectivamente;
interpolación: método de interpolación, predeterminado Utilice interpolación bilineal cv2.INTER_LINEAR;

img_ret1 = cv2.resize(img1,(800,800))
img_ret2 = cv2.resize(img1,None,fx=0.5,fy=0.3)

2. Transpose transpose()
transpose() puede realizar el intercambio de las coordenadas de los ejes xey del subíndice de píxeles: dst(i,j)=src(j,i)
dst = cv2.transpose(src[, dst])

img_ret1 = cv2.transpose(img1)
#图像显示效果看,图像以对角线为轴,进行了翻转

3. La función Flip flip()
flip() puede realizar un giro horizontal, un giro vertical y un giro bidireccional de la imagen.src
dst=cv2.flip(src, flipCode[, dst])
: imagen de origen;
flipCode: modo de giro, 0 significa giro del eje horizontal (giro hacia arriba y hacia abajo), mayor que 0 significa Voltear el eje vertical (Voltear hacia la izquierda y hacia la derecha), si es menor que 0, realizar un giro bidireccional.

```bash
img_ret1 = cv2.flip(img1,0)#水平轴翻转(上下翻转)
img_ret2 = cv2.flip(img1,1)#垂直轴翻转(左右翻转)
img_ret3 = cv2.flip(img1,-1)#双向翻转```
#matplotlib显示 ,需进行通道调换
fig,ax = plt.subplots(2,2)
ax[0,0].set_title('原图')
ax[0,0].imshow(cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)) #matplotlib显示图像为rgb格式
ax[0,1].set_title('上下翻转')
ax[0,1].imshow(cv2.cvtColor(img_ret1,cv2.COLOR_BGR2RGB))
ax[1,0].set_title('左右翻转')
ax[1,0].imshow(cv2.cvtColor(img_ret2,cv2.COLOR_BGR2RGB))
ax[1,1].set_title('双向翻转') 
ax[1,1].imshow(cv2.cvtColor(img_ret3,cv2.COLOR_BGR2RGB))
ax[0,0].axis('off');ax[0,1].axis('off');ax[1,0].axis('off');ax[1,1].axis('off')#关闭坐标轴显示
plt.show() 

4.Transformación afínwarpAffine()

Origen de transformación afín
dst=cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
: imagen de entrada.
M: Matriz de transformación de 2×3 2 filas y 3 columnas.
dsize: el tamaño de la imagen de salida.
dst: opcional, imagen de salida, tamaño especificado por dsize, el tipo es el mismo que src.
banderas: opcional, método de interpolación
borderMode: opcional, modo de píxel de borde
borderValue: opcional, valor de relleno de borde; el valor predeterminado es 0

4.1 Traducción
La imagen se puede desplazar especificando manualmente el operador M=[[1,0,X],[0,1,Y]], donde X representa el valor de píxel que se mueve en la dirección x (derecha) de la imagen. e Y Representa el valor de píxel de la imagen que se mueve en la dirección y (hacia abajo).

import matplotlib.pyplot as plt
import numpy as np
import cv2

plt.rc('font',family='Youyuan',size='9')
plt.rc('axes',unicode_minus='False')

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

M = np.float32([[1,0,100],[0,1,50]])   #右移100-下移50
img_ret1 = cv2.warpAffine(img,M,(cols,rows))
M = np.float32([[1,0,-100],[0,1,-50]]) #左移100-上移50
img_ret2 = cv2.warpAffine(img,M,(cols,rows))
M = np.float32([[1,0,-100],[0,1,50]])  #左移100-下移50
img_ret3 = cv2.warpAffine(img,M,(cols,rows))

fig,ax = plt.subplots(2,2)
ax[0,0].set_title('原图   by VX:桔子code')
ax[0,0].imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)) #matplotlib显示图像为rgb格式
ax[0,1].set_title('右移100-下移50')
ax[0,1].imshow(cv2.cvtColor(img_ret1,cv2.COLOR_BGR2RGB))
ax[1,0].set_title('左移100-上移50')
ax[1,0].imshow(cv2.cvtColor(img_ret2,cv2.COLOR_BGR2RGB))
ax[1,1].set_title('左移100-下移50') 
ax[1,1].imshow(cv2.cvtColor(img_ret3,cv2.COLOR_BGR2RGB))
#ax[0,0].axis('off');ax[0,1].axis('off');ax[1,0].axis('off');ax[1,1].axis('off')#关闭坐标轴显示
plt.show() 

4.2 Rotación La
rotación requiere que el método getRotationMatrix2D()construya primero warpAffine()el operador M. getRotationMatrix2D()La forma de la interfaz es:

retval=cv2.getRotationMatrix2D(center, angle, scale)

centro: posición central de rotación
ángulo: ángulo de rotación
escala: relación de escala, 1 cuando no está escalando

import matplotlib.pyplot as plt
import numpy as np
import cv2
plt.rc('font',family='Youyuan',size='9')
plt.rc('axes',unicode_minus='False')

img = cv2.imread('mess.jpg')
rows,cols,_ = img.shape

#以图像中心旋转
M = cv2.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1)#逆时针90度
img_ret1 = cv2.warpAffine(img,M,(cols,rows))
M = cv2.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),-90,1)#顺时针90度
img_ret2 = cv2.warpAffine(img,M,(cols,rows))
M = cv2.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),-180,1)#顺时针180度
img_ret3 = cv2.warpAffine(img,M,(cols,rows))

#显示图像
fig,ax = plt.subplots(2,2)
ax[0,0].set_title('VX:桔子code   原图')
ax[0,0].imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)) #matplotlib显示图像为rgb格式
ax[0,1].set_title('逆时针90度')
ax[0,1].imshow(cv2.cvtColor(img_ret1,cv2.COLOR_BGR2RGB))
ax[1,0].set_title('顺时针90度')
ax[1,0].imshow(cv2.cvtColor(img_ret2,cv2.COLOR_BGR2RGB))
ax[1,1].set_title('顺时针180度') 
ax[1,1].imshow(cv2.cvtColor(img_ret3,cv2.COLOR_BGR2RGB))
ax[0,0].axis('off');ax[0,1].axis('off');ax[1,0].axis('off');ax[1,1].axis('off')#关闭坐标轴显示
plt.show() 

4.3 CorreccióngetAffineTransform()
getAffineTransform() para construir el operador M, los parámetros de entrada son dos conjuntos de puntos de coordenadas antes y después de la transformación, cada conjunto de puntos de coordenadas contiene 3 parámetros de posición.

5. Girar rotar ()

cv2.rotate(src, rotateCode[, dst]) -> dst, donde src es la imagen fuente, turnCode puede elegir 3 parámetros:
cv2.ROTATE_90_CLOCKWISE Girar 90 grados en el sentido de las
agujas del reloj cv2.ROTATE_180 Girar 180 grados, no se hace distinción entre el sentido de las agujas del reloj o el sentido contrario a las agujas del reloj, el efecto es el mismo
cv2.ROTATE_90_COUNTERCLOCKWISE Girar 90 grados en el sentido contrario a las agujas del reloj, lo que equivale a 270 grados en el sentido de las agujas del reloj

img_ret1 = cv2.rotate(img,cv2.ROTATE_90_CLOCKWISE)
img_ret2 = cv2.rotate(img,cv2.ROTATE_180)
img_ret3 = cv2.rotate(img,cv2.ROTATE_90_COUNTERCLOCKWISE)

6. Transformación de perspectiva warpPerspective()

La transformación de perspectiva requiere encontrar 4 puntos para construir el núcleo. cv2.warpPerspective(src,M,dsize[,dst[,flags[,borderMode[,borderValue]]]])->dst
src: imagen de entrada.
M: Matriz de transformación de 3×3 3 filas y 3 columnas.
dsize: el tamaño de la imagen de salida.
dst: opcional, imagen de salida, el tamaño lo especifica dsize y el tipo de datos es el mismo que src.
banderas: opcional, método de interpolación
borderMode: opcional, modo de píxel de borde
borderValue: opcional, valor de relleno de borde; el valor predeterminado es 0.

pts1 = np.float32([[192,40],[610,122],[216,363],[465,415]])
pts2 = np.float32([[0,0],[300,0],[0,350],[300,350]])
kernel = cv2.getPerspectiveTransform(pts1,pts2) #该函数构建kernel
img_pers = cv2.warpPerspective(img_src,kernel,(300,350))

La transformación afín puede realizar la traducción, rotación y corrección de imágenes; la rotación mediante transformación afín provocará pérdida de imagen y bordes negros. El método rotar () puede resolver este problema; rotar () en realidad se implementa encapsulando transposición y flip3 Rotación en un ángulo, rotar() no admite la rotación en otros ángulos.

Supongo que te gusta

Origin blog.csdn.net/aqiangdeba/article/details/129764909
Recomendado
Clasificación