仿射变换
旋转、平移与缩放
import cv2
img = cv2.imread("1.png")
h, w = img.shape[0], img.shape[1]
m = cv2.getRotationMatrix2D(center=(w // 2, h // 2), angle=-30, scale=0.5)
print(m)
得到的旋转矩阵参数如下:
[[0.433 -0.25 198.14]
[0.25 0.433 16.25]]
import cv2
img = cv2.imread("1.png")
h, w = img.shape[0], img.shape[1]
m = cv2.getRotationMatrix2D(center=(w // 2, h // 2), angle=-30, scale=0.5)
r_img = cv2.warpAffine(src=img, M=m, dsize=(w, h), borderValue=(0, 0, 0))
cv2.imshow("origin", img)
cv2.imshow("rotation_scale_trans", r_img)
cv2.waitKey(0)
如图,左边是原图,右边是旋转、缩放、平移后的图片(注意,旋转后如果有超出指定范围dsize的像素都会被截去)。
错切
import math
import cv2
import numpy as np
img = cv2.imread("1.png")
cv2.imshow("origin", img)
h, w = img.shape[0], img.shape[1]
origin_coord = np.array([[0, 0, 1], [w, 0, 1], [w, h, 1], [0, h, 1]])
theta = 30 # shear角度
tan = math.tan(math.radians(theta))
# x方向错切
m = np.eye(3)
m[0, 1] = tan
shear_coord = (m @ origin_coord.T).T.astype(np.int)
shear_img = cv2.warpAffine(src=img, M=m[:2],
dsize=(np.max(shear_coord[:, 0]), np.max(shear_coord[:, 1])),
borderValue=(0, 0, 0))
cv2.imshow("shear_x", shear_x)
cv2.waitKey(0)