[Reproducido] Serie OpenCV-Python de traducción de rotación de zoom de imagen (14)

En OpenCV, a menudo usamos escalado, rotación y traducción de imágenes. Por ejemplo, a veces queremos operar en un tipo de imagen. En este momento, necesitamos unificar el tamaño de este tipo de imagen y aprender sobre el aprendizaje profundo en el futuro. En, también encontraremos que para el entrenamiento del conjunto de datos, sus muestras del conjunto de datos suelen ser de tamaño uniforme.

Enfocar

En OpenCV, use la función cv2.resize () para realizar el formato de sintaxis de zoom de imagen:

dst = cv2.resize (src, dsize [, fx [, fy [, interpolación]]])

(1) src: imagen original

(2) dsize: ampliar el tamaño de la imagen, si dsize = 0, el método de cálculo predeterminado es el siguiente: dsize = Size (round (fx ∗ src.cols), round (fy ∗ src.rows))

(3) fx fy y dsize no pueden ser 0 al mismo tiempo. Fx, fy es el factor de zoom en los ejes xey respectivamente. Cuando el valor predeterminado es 0, fx = (doble) dsize.width / src.cols, fy = (double) dsize .height / src.cols, el parámetro predeterminado es 0, no se puede escribir como está

(4) Interpolación: El método de diferencia se puede utilizar de forma predeterminada. El valor predeterminado es INTER_LINEAR, una interpolación bilineal (utilizado de forma predeterminada). Diferencia de corriente:
Inserte la descripción de la imagen aquí

La representación de coordenadas a la que estamos acostumbrados es la coordenada x primero, y luego la coordenada y. En el procesamiento de imágenes, este pensamiento inercial suele ser incorrecto.

Porque en la computadora, la imagen se almacena en forma de matriz, fila primero y luego columna. Por lo tanto, una imagen con ancho × alto × canal de color = 480 × 256 × 3 se guardará en un tensor tridimensional de 256 × 480 × 3. El procesamiento de imágenes también se calcula de acuerdo con esta idea (incluido el procesamiento de imágenes bajo OpenCV), es decir, alto × ancho × canal de color.

Pero aquí viene el problema, la API cv2.resize es una excepción menor. Porque su entrada de parámetro es ancho × alto × canal de color.

Veamos el código:

view plaincopy to clipboardprint?
import cv2  
pic = cv2.imread("cat.jpg")  
cv2.imshow("org",pic)  
pic = cv2.resize(pic, (400, 400), interpolation=cv2.INTER_CUBIC)  
cv2.imshow('res', pic)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

Primero mira el efecto de imagen original:
Inserte la descripción de la imagen aquí

Mira el efecto después de hacer zoom:
Inserte la descripción de la imagen aquí

Descubrimos que la relación de aspecto después de encoger de esta manera no es la misma que la imagen original. Ahora podemos mejorar el código:

view plaincopy to clipboardprint?
import cv2  
pic = cv2.imread("cat.jpg")  
cv2.imshow("org",pic)  
pic = cv2.resize(pic, (0, 0), fx=0.5, fy=0.5,  
                              interpolation=cv2.INTER_NEAREST)  
cv2.imshow('res', pic)  
cv2.waitKey(0)  
cv2.destroyAllWindows() 

Veamos directamente la imagen ampliada:
Inserte la descripción de la imagen aquí

Aquí, si no especificamos directamente el tamaño escalado, especificaremos directamente la relación de zoom a través de fx y fy, y 0.5 significa que la longitud y el ancho son la mitad del original.

Girar

La rotación de la imagen en OpenCV es principalmente para obtener la matriz de rotación de la imagen a través de la función getRotationMatrix2D, y luego obtener la imagen rotada a través de la función de transformación afín warpAffine.

Veamos la función:

cv2.getRotationMatrix2D (centro, ángulo, escala)

· Punto central de rotación central (cx, cy) que puede especificar

· La unidad del ángulo de rotación del ángulo es que el ángulo en sentido antihorario es la dirección positiva y el ángulo es positivo, lo que significa en sentido antihorario.

· Factor de zoom de escala. Un valor igual a 1.0 significa que el tamaño permanece sin cambios

Esta función devuelve la matriz de transformación afín M, y luego pasamos esta matriz de transformación afín a la siguiente función:

cv2.warpAffine (src, M, dsize [, dst [, flags [, borderMode [, borderValue]]]]) → dst

imagen de entrada src.

Matriz de transformación M.

dsize: el tamaño de la imagen de salida.

banderas-combinación de métodos de interpolación (tipo int!)

borderMode-modo de píxel de borde (tipo int!)

borderValue-valor de relleno del borde; por defecto, es 0.

Ahora hablemos del principio de rotación de imágenes:

Nos basamos en la fórmula:
Inserte la descripción de la imagen aquí

Poder dibujar:
Inserte la descripción de la imagen aquí

Entonces la matriz de transformación correspondiente es:
Inserte la descripción de la imagen aquí

Veamos el código:

view plaincopy to clipboardprint?
import cv2  
img = cv2.imread("cat.jpg")  
rows,cols = img.shape[:2]  
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)  
dst = cv2.warpAffine(img,M,(cols,rows))  
cv2.imshow('res', dst)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

El efecto después de la rotación:
Inserte la descripción de la imagen aquí

Traducción de imágenes

La traducción de la imagen es en realidad el movimiento de la matriz, es el tipo más simple de transformación espacial y su expresión es:

Donde (b0, b1) es el desplazamiento.

Por ejemplo, si se traslada 10 píxeles a la derecha y 30 píxeles hacia abajo, entonces la matriz de transformación M:
Inserte la descripción de la imagen aquí

Veamos el código fuente:

view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread('cat.jpg')  
height,width,channel = img.shape  

#声明变换矩阵 向右平移10个像素, 向下平移30个像素

M = np.float32([[1, 0, 10], [0, 1, 30]])  

#进行2D 仿射变换

shifted = cv2.warpAffine(img, M, (width, height))  
cv2.imshow('res', shifted)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

Demostración de efectos:
Inserte la descripción de la imagen aquí

Si necesita modificar la orientación de la traducción, solo necesita modificar el valor de la matriz.

Consulte la página de resumen del artículo https://blog.csdn.net/weixin_44237705/article/details/107864965
Se puede intercambiar más información técnica de openvino en el grupo ~
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_44237705/article/details/108141296
Recomendado
Clasificación