En este artículo se describe la python3 + OpenCV2 lograr transformaciones geométricas imagen (traducción, lo que refleja, escala, rotación, afín), Xiao Bian siento muy bien, ahora para que todos puedan compartir, sino también para ser una referencia. Venir a ver, seguir las pequeñas series juntas
Prólogo
. Resumir algunas notas sobre la imagen OpenCV transformación geométrica recientemente leer
esta obra de arte es:
1. Traducción
import cv2
import numpy as np
img = cv2.imread("image0.jpg", 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
mode = imgInfo[2]
dst = np.zeros(imgInfo, np.uint8)
for i in range( height ):
for j in range( width - 100 ):
dst[i, j + 100] = img[i, j]
cv2.imshow('image', dst)
cv2.waitKey(0)
demo es muy simple, la imagen se desplaza por 100 píxeles a la derecha en la figura:
2. Espejo
import cv2
import numpy as np
img = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height= imgInfo[0]
width = imgInfo[1]
deep = imgInfo[2]
dst = np.zeros([height*2, width, deep], np.uint8)
for i in range( height ):
for j in range( width ):
dst[i,j] = img[i,j]
dst[height*2-i-1,j] = img[i,j]
for i in range(width):
dst[height, i] = (0, 0, 255)
cv2.imshow('image', dst)
cv2.waitKey(0)
efecto que genera una demo:
3. Ampliar
import cv2
img = cv2.imread("image0.jpg", 1)
imgInfo = img.shape
print( imgInfo )
height = imgInfo[0]
width = imgInfo[1]
mode = imgInfo[2]
# 1 放大 缩小 2 等比例 非等比例
dstHeight = int(height * 0.5)
dstWeight = int(width * 0.5)
# 最近邻域插值 双线性插值 像素关系重采样 立方插值
dst = cv2.resize(img, (dstWeight,dstHeight))
print(dst.shape)
cv2.imshow('image', dst)
cv2.waitKey(0)
Uso cambiar el tamaño de la operación directa de escala, sino que también se puede escalar usando el método de interpolación vecino, de la siguiente manera:
# 1 info 2 空白模板 3 重新计算x, y
import cv2
import numpy as np
img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape # 先高度,后宽度
height = imgInfo[0]
width = imgInfo[1]
dstHeight = int(height/2)
dstWidth = int(width/2)
dstImage = np.zeros([dstHeight, dstWidth, 3], np.uint8)
for i in range( dstHeight ):
for j in range(dstWidth):
iNew = i * ( height * 1.0 / dstHeight )
jNew = j * ( width * 1.0 / dstWidth )
dstImage[i,j] = img[int(iNew),int(jNew)]
cv2.imshow('image', dstImage)
cv2.waitKey(0)
4. Girar
import cv2
img = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height= imgInfo[0]
width = imgInfo[1]
deep = imgInfo[2]
# 定义一个旋转矩阵
matRotate = cv2.getRotationMatrix2D((height*0.5, width*0.5), 45, 0.7) # mat rotate 1 center 2 angle 3 缩放系数
dst = cv2.warpAffine(img, matRotate, (height, width))
cv2.imshow('image',dst)
cv2.waitKey(0)
Rotación necesidad de definir una matriz de rotación, cv2.getRotationMatrix2D (), los parámetros 1: 2 requiere un punto de centro de rotación de los parámetros: ángulo de rotación requiere tres parámetros: la relación de zoom requiere resultados como se muestra:
5. afín
import cv2
import numpy as np
img = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height= imgInfo[0]
width = imgInfo[1]
deep = imgInfo[2]
# src 3 -> dst 3 (左上角, 左下角,右上角)
matSrc = np.float32([[0,0],[0,height-1],[width-1, 0]]) # 需要注意的是 行列 和 坐标 是不一致的
matDst = np.float32([[50,50],[100, height-50],[width-200,100]])
matAffine = cv2.getAffineTransform(matSrc,matDst) #mat 1 src 2 dst 形成组合矩阵
dst = cv2.warpAffine(img, matAffine,(height, width))
cv2.imshow('image',dst)
cv2.waitKey(0)
Tres coordenadas necesarias para determinar la matriz de la imagen, y (arriba izquierda, inferior izquierda, superior derecha). Coordenadas de tres puntos definen dos matrices, matSrc de la imagen original, matDst coordenadas afines de tres puntos se lleva a cabo por cv2 . .getAffineTransform () se combinaron para formar un efecto de la matriz es la siguiente:
el contenido en más de cuántos, y finalmente a recomendar una buena reputación en el número de instituciones públicas [programadores], hay una gran cantidad de veteranos habilidades de aprendizaje, la experiencia de aprendizaje, habilidades de la entrevista, la experiencia laboral y otra acción, tanto más hemos preparado cuidadosamente la basada en cero información introductoria, información sobre proyectos reales, el tiempo tiene que explicar la tecnología programador Python todos los días, compartir algunos métodos de aprendizaje y la necesidad de prestar atención a los pequeños detalles