Processamento geométrico de imagem Opencv e implementação de python de rotação de imagem

Processamento geométrico de imagens da Opencv e implementação python de imagens rotativas

Introdução: No campo do aprendizado profundo, costumamos usar translação, rotação, espelhamento e outras operações para aumento de dados; no campo CV tradicional, devido a alguns problemas de ângulo de tiro, precisamos corrigir a imagem, e a transformação geométrica é esse processo. Portanto, é necessário compreender e aprender a transformação geométrica.

  • A maioria dos princípios da transformação geométrica são semelhantes, mas a matriz de transformação é diferente, portanto, tomamos a translação e rotação mais comumente usadas como exemplos de aprendizagem.
    O método de transformação para uma posição de pixel é o seguinte
    Insira a descrição da imagem aqui

OT na fórmula é a matriz de transformação, onde (v, w) são as coordenadas originais e (x, y) são as coordenadas transformadas. Diferentes transformações correspondem a diferentes matrizes. Matrizes de transformação comuns e suas funções são as seguintes:

Insira a descrição da imagem aqui

Transformação do sistema de coordenadas

  • Centro de transformação. Para zoom e translação, a origem das coordenadas da imagem (o canto superior esquerdo da imagem é a origem) pode ser usada como o centro para transformar . Isso não requer a transformação do sistema de coordenadas e pode ser calculada diretamente na forma geral. Para rotação e deslocamento , a origem geralmente é baseada no centro da imagem , o que envolve a conversão do sistema de coordenadas.
  • A origem das coordenadas da imagem está no canto superior esquerdo da imagem, horizontalmente à direita está o eixo X e verticalmente para baixo está o eixo Y. O sistema de coordenadas comum em livros de matemática é baseado no centro da imagem como a origem, a horizontal direita é o eixo X e a vertical para cima é o eixo Y, que é chamado de sistema de coordenadas cartesiano. Olhe para a foto abaixo:

Insira a descrição da imagem aqui

Portanto, para rotação e deslocamento, 3 etapas (3 transformações) são necessárias:

  • 1. Converta as coordenadas da imagem da imagem original de entrada para o sistema de coordenadas cartesiano;
  • 2. Faça cálculos de rotação. A matriz de rotação foi fornecida anteriormente;
  • 3. Converta as coordenadas cartesianas da imagem girada de volta para as coordenadas da imagem.

Portanto, de acordo com as 3 etapas (3 transformações) mencionadas acima, a forma de rotação da transformação (rotação no sentido horário) é, existem 3 matrizes em 3 transformações:

Insira a descrição da imagem aqui

Mapeamento reverso

  • No "Digital Image Processing_Third Edition" de Gonzalez, é muito claro que o mapeamento direto é para calcular diretamente a posição espacial do pixel correspondente da imagem de saída de acordo com a imagem original com uma fórmula de transformação. Então, isso causará um problema: pode ser Existem várias coordenadas de pixel mapeadas para a mesma posição da imagem de saída ou algumas posições da imagem de saída podem não corresponder ao pixel da imagem de entrada correspondente, ou seja, eles não são mapeados, resultando em orifícios regulares (favo de mel preto) . A melhor maneira é usar o Mapeamento Inverso: digitalize a posição (x, y) da imagem de saída, calcule a posição (v, w) correspondente à imagem de entrada por meio de Imagem (a matriz inversa de T) e use a interpolação O método determina o valor de cinza da posição na imagem de saída.

Interpolação

  • Depois que o mapeamento reverso é usado, o valor da posição da imagem de saída precisa ser determinado pelo método de interpolação, portanto, o algoritmo de interpolação precisa ser selecionado. Normalmente, há interpolação de vizinho mais próximo, interpolação bilinear, interpolação bicúbica, etc. OpencV usa interpolação bilinear por padrão.

1. Chamada de interface Opencv

A seguir está a chamada da interface de transformação geométrica da imagem em opencv

import cv2
import numpy as np

Tradução de imagem

#读取图片
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()

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Rotação de imagem

#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()

Insira a descrição da imagem aqui

Transformação afim

  • A transformação afim é uma transformação linear de coordenadas bidimensionais para coordenadas bidimensionais e mantém o "nivelamento" dos gráficos bidimensionais. As linhas que eram paralelas antes da conversão permanecem paralelas após a conversão. Como mostrado abaixo:
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()

Insira a descrição da imagem aqui

resumo

  • 1. No campo CV tradicional, devido ao problema do ângulo de disparo da câmera, precisamos corrigir a imagem.Os métodos de processamento envolvidos incluem translação, rotação, afinidade e perspectiva.
  • 2. O processo de transformação geométrica da imagem consiste em usar a matriz de transformação para mapear as coordenadas do pixel da imagem.
  • 3. Para girar a imagem, você precisa especificar o centro do círculo. Aqui você precisa transformar o sistema de coordenadas em um sistema de coordenadas cartesiano com o centro de rotação como origem e, em seguida, voltar ao sistema de coordenadas da imagem após a conclusão do mapeamento.
  • 4. No processo de mapeamento, o mapeamento reverso é melhor, e o mapeamento direto pode ter sobreposições e lacunas de mapeamento.Geralmente, a interpolação bilinear é usada para mapear os níveis de cinza.

2. A implementação do código python de rotação de imagem

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()

Insira a descrição da imagem aqui

Acho que você gosta

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