warpAffine函数讲解,图片可自行下载,也可用自己的图片
原图im
平移im_shifted
旋转im_rotated
# 图像仿射变换
# 步骤: 读取图像 -> 创建仿射变换矩阵 -> 仿射变换计算
# 平移变换矩阵:一种写法,直接写死
# 旋转变换矩阵:根据角度、中心点、缩放比例计算
import numpy as np
import cv2
def translate(img, x, y):
'''
仿射变换之平移变换
:param img: 原始图像
:param x: x方向平移的像素点 x参数为正,图像向右平移,x参数为负,图像向左平移
:param y: y方向平移的像素点 y参数为正,图像上下平移,y参数为负,图像向上平移
:return: 平移后的图像
'''
h, w = img.shape[:2] # 取出图像高度和宽度(shape返回值(高, 宽, 通道数))
# 构建平移变换矩阵 x轴 方向平移 x个像素点,y轴 方向平移 y个像素点
M = np.float32([[1, 0, x],
[0, 1, y]])
# 执行仿射变换:warpAffine
shifted = cv2.warpAffine(img, # 原图
M, # 仿射变换矩阵
(w, h)) # 输出图像的宽、高
return shifted
def rotate(img, angle, center=None, scale=1.0):
'''
仿射变换之图像旋转
:param img: 原图数据
:param angle: 旋转的角度 正数为逆时针旋转,负数为顺时针旋转
:param center: 旋转中心点,坐标值(x,y),默认为None
:param scale: 缩放比例,默认为1.0,默认不做缩放
:return: 旋转变换后的图像
'''
h, w = img.shape[:2] # 取图像的高、宽
# 判断center是否为空,为空则计算原图的中心作为旋转中心点
if center is None:
center = (w/2, h/2) # 计算原图 中心点 x,y坐标值
# 计算仿射变换矩阵
M = cv2.getRotationMatrix2D(center, # 旋转中心
angle, # 旋转角度
scale) # 缩放比例
# 根据仿射变换矩阵,执行旋转,并返回旋转后的结果
rotated = cv2.warpAffine(img, M, (w, h))
return rotated
# 写一个自己本地存放图片的路径
im = cv2.imread("../img_data/lena.jpg")
cv2.imshow("im", im)
im_shifted = translate(im, 50, 50)
cv2.imshow("im_shifted", im_shifted)
im_rotated = rotate(im, -135, None, 1.0)
cv2.imshow("im_rotated", im_rotated)
cv2.waitKey()
cv2.destroyAllWindows()