Implementación de python de procesamiento geométrico de imágenes opencv y rotación de imágenes

Procesamiento geométrico de imágenes de Opencv e implementación de Python de imágenes giratorias

Introducción: En el campo del aprendizaje profundo, a menudo usamos traducción, rotación, duplicación y otras operaciones para el aumento de datos; en el campo CV tradicional, debido a algunos problemas de ángulo de disparo, necesitamos corregir la imagen, y la transformación geométrica es este proceso. Por tanto, es necesario comprender y aprender la transformación geométrica.

  • La mayoría de los principios de la transformación geométrica son similares, pero la matriz de transformación es diferente, por lo que tomamos la traducción y rotación más comúnmente utilizadas como ejemplos para el aprendizaje.
    El método de transformación para una posición de píxel es el siguiente
    Inserte la descripción de la imagen aquí

La T en la fórmula es la matriz de transformación, donde (v, w) son las coordenadas originales y (x, y) son las coordenadas transformadas. Diferentes transformaciones corresponden a diferentes matrices. Las matrices de transformación comunes y sus funciones son las siguientes:

Inserte la descripción de la imagen aquí

Transformación del sistema de coordenadas

  • Centro de transformación. Para hacer zoom y traslación, el origen de las coordenadas de la imagen (la esquina superior izquierda de la imagen es el origen) se puede utilizar como centro de transformación . Esto no requiere la transformación del sistema de coordenadas y se puede calcular directamente en forma general. Para la rotación y el desplazamiento , el origen suele ser el centro de la imagen , lo que implica la conversión del sistema de coordenadas.
  • El origen de las coordenadas de la imagen se encuentra en la esquina superior izquierda de la imagen, horizontalmente a la derecha está el eje X y verticalmente hacia abajo está el eje Y. El sistema de coordenadas común en los libros de texto de matemáticas se basa en el centro de la imagen como origen, la horizontal a la derecha es el eje X y la vertical hacia arriba es el eje Y, que se denomina sistema de coordenadas cartesianas. Mira la foto de abajo:

Inserte la descripción de la imagen aquí

Por lo tanto, para la rotación y el desplazamiento, se requieren 3 pasos (3 transformaciones):

  • 1. Convierta las coordenadas de la imagen de la imagen original de entrada al sistema de coordenadas cartesianas;
  • 2. Realice cálculos de rotación. La matriz de rotación se ha dado antes;
  • 3. Convierta las coordenadas cartesianas de la imagen rotada a las coordenadas de la imagen.

Por lo tanto, de acuerdo con los 3 pasos (3 transformaciones) mencionados anteriormente, la forma de transformación de rotación (rotación en sentido horario) es, hay 3 matrices en 3 transformaciones:

Inserte la descripción de la imagen aquí

Mapeo inverso

  • En la "Tercera edición del procesamiento de imágenes digitales" de González, está muy claro que el mapeo directo consiste en calcular directamente la posición espacial del píxel correspondiente de la imagen de salida de acuerdo con la imagen original con una fórmula de transformación. Entonces esto causará un problema: puede ser Hay varias coordenadas de píxeles asignadas a la misma posición de la imagen de salida, o algunas posiciones de la imagen de salida pueden no coincidir en absoluto con el píxel de la imagen de entrada correspondiente, es decir, no están asignadas, lo que da como resultado agujeros regulares (panal negro) . Una mejor manera es usar el mapeo inverso: escanee la posición (x, y) de la imagen de salida, calcule la posición (v, w) correspondiente a la imagen de entrada a través de Imagen (la matriz inversa de T) y use la interpolación El método determina el valor de gris de la posición en la imagen de salida.

Interpolación

  • Después de adoptar el mapeo inverso, el valor de la posición de la imagen de salida debe determinarse mediante el método de interpolación, por lo que debe seleccionarse el algoritmo de interpolación. Por lo general, hay interpolación de vecino más cercano, interpolación bilineal, interpolación bicúbica, etc. OpencV usa la interpolación bilineal por defecto.

1.Llamada de interfaz Opencv

La siguiente es la llamada de interfaz de transformación geométrica de la imagen en opencv

import cv2
import numpy as np

Traducción de imágenes

#读取图片
img = cv2.imread('E:/Machine Learning/OpenCV/task2/task2.jpg',)
#getRotationMatrix2D有三个参数,第一个为旋转中心,第二个为旋转角度,第三个为缩放比例
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
rows,cols,channel=img.shape
move=np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img, move, (rows,cols))
cv2.imshow('original', img)
cv2.imshow('result', dst)
cv2.imwrite('E:/Machine Learning/OpenCV/task2/1.jpg',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Rotacion de imagen

#getRotationMatrix2D有三个参数,第一个为旋转中心,第二个为旋转角度,第三个为缩放比例
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img, M, (rows,cols))
cv2.imshow('original', img)
cv2.imshow('result', dst)
cv2.imwrite('E:/Machine Learning/OpenCV/task2/2.jpg',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

Inserte la descripción de la imagen aquí

Transformacion afin

  • La transformación afín es una transformación lineal de coordenadas bidimensionales a coordenadas bidimensionales y mantiene la "planitud" de los gráficos bidimensionales. Las líneas que eran paralelas antes de la conversión permanecen paralelas después de la conversión. Como se muestra abajo:
pst1=np.float32([[50,50],[0,100],[200,100]])
pst2=np.float32([[10,100],[200,70],[150,300]])
M=cv2.getAffineTransform(pst1,pst2)
dst=cv2.warpAffine(img,M,(rows,cols))
cv2.imshow('original', img)
cv2.imshow('result', dst)
cv2.imwrite('E:/Machine Learning/OpenCV/task2/3.jpg',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

Inserte la descripción de la imagen aquí

resumen

  • 1. En el campo CV tradicional, debido al ángulo de disparo de la cámara, necesitamos corregir la imagen.Los métodos de procesamiento involucrados incluyen traducción, rotación, afín y perspectiva.
  • 2. El proceso de transformación geométrica de la imagen consiste en utilizar la matriz de transformación para mapear las coordenadas de píxeles de la imagen.
  • 3. Para rotar la imagen, debe especificar el centro del círculo. Aquí debe transformar el sistema de coordenadas al sistema de coordenadas cartesiano con el centro de rotación como origen. Una vez completado el mapeo, volverá al sistema de coordenadas de la imagen.
  • 4. En el proceso de mapeo, el mapeo hacia atrás es mejor y el mapeo hacia adelante puede tener superposiciones y agujeros de mapeo Generalmente, la interpolación bilineal se usa para mapear niveles de gris.

2. La implementación del código Python de la rotación de imágenes

import numpy as np
import cv2
import matplotlib as mpl
import matplotlib.pyplot as plt
# 排除警告信息
import warnings
# matplotlib画图常见参数设置
mpl.rcParams["font.family"] = "SimHei" 
# 设置字体
mpl.rcParams["axes.unicode_minus"]=False 
# 用来正常显示负号
plt.rcParams['font.sans-serif']=['SimHei'] 
# 用来正常显示中文标签# 嵌入式显示图形
%matplotlib inline
warnings.filterwarnings("ignore")
#读取图片
img = cv2.imread('E:/Machine Learning/OpenCV/task2/task2.jpg',cv2.IMREAD_GRAYSCALE)
rows,cols=img.shape
#设置旋转角度,np.sin()使用弧度计算
rote=45
pi_rote=np.pi*45/180

#变换矩阵
n=cols/2
m=rows/2
change_ax=np.matrix([[1,0,0],[0,-1,0],[-n,m,1]])
rote_img=np.matrix([[np.cos(pi_rote),-np.sin(pi_rote),0],[np.sin(pi_rote),np.cos(pi_rote),0],[0,0,1]])
change_back=np.matrix([[1,0,0],[0,-1,0],[n,m,1]])
T1=np.matmul(change_ax,rote_img)
T2=np.matmul(T1,change_back)
T=T2.I

#构建一个同样规格的图片
img1 = np.ones((rows,cols), np.uint8)*255

#利用变换矩阵,算该图片像素对应的灰度
for i in range(cols):
    for j in range(rows):
        rloc=[i,j,1]
        oloc=np.matmul(rloc,T)
        x,y= np.ceil(oloc[0,0]).astype(int), np.ceil(oloc[0,1]).astype(int)
        if (x<0 or x>cols-1) or(y<0 or y>rows-1):
            cor=255
        else:
            cor=img.item(x,y)
            img1.itemset((i,j),cor)
        
#显示变换后的图像
plt.subplot(1,2,1)
plt.title('原始图')
plt.imshow(img)
plt.subplot(1,2,2)
plt.title('旋转45度')
plt.imshow(img1)
plt.show()

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/hu_hao/article/details/105711592
Recomendado
Clasificación