【opencv 学习】仿射变换(图像的旋转、缩放、平移)

请添加图片描述

import numpy as np
import cv2

# 仿射变换的两种方式:
#     1、利用变换前后的三个坐标点达到变换目的。
#     2、使用旋转角度和缩放倍数来变换。
# 可以用矩阵相乘或者向量叠加到矩阵表示的所有操作(旋转、平移(向量叠加)、缩放),这个就是类似于一个矩阵的变换。图像本身就是一个矩阵

img = cv2.imread(r'images/build.jpeg', 1)
rows, cols, channels = img.shape  # h,w,c

# 第一部分:利用变换前的点和变换后的点求出仿射变换矩阵
p1 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]])  # 原图像的点的集合
p2 = np.float32([[0, rows * 0.3], [cols * 0.45, rows * 0.25], [cols * 0.15, rows * 0.58]])  # 变换后的图像的点的集合

M = cv2.getAffineTransform(p1, p2)  # 仿射变换矩阵
img_rotated_by_points = cv2.warpAffine(img, M, dsize=(cols, rows))  # M 就是仿射变换矩阵, dsize就是原始图像size


# 第二部分:利用旋转角度和缩放比例来求出仿射变换矩阵
center = (cols / 4, rows / 4)  # 这个点就是未来的平移点
rot_mat = cv2.getRotationMatrix2D(center=center, angle=-35, scale=0.5)  # 中心点,旋转角度,缩放比例
img_rotated_by_alpha = cv2.warpAffine(img, rot_mat, (cols, rows))


res = np.hstack((img, img_rotated_by_points, img_rotated_by_alpha))
cv2.imshow('img', res)
cv2.waitKey(0)
cv2.destroyAllWindows()




效果如下:
请添加图片描述

猜你喜欢

转载自blog.csdn.net/qq_29367075/article/details/123026960