Spaces:
Running
Running
File size: 2,537 Bytes
9b2289b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
"""
人脸旋转矫正模块
本模块提供了用于旋转图像的函数,主要用于人脸旋转矫正。
包含了处理3通道和4通道图像的旋转函数。
"""
import cv2
import numpy as np
def rotate_bound(image: np.ndarray, angle: float, center=None):
"""
旋转图像而不损失信息的函数
Args:
image (np.ndarray): 输入图像,3通道numpy数组
angle (float): 旋转角度(度)
center (tuple, optional): 旋转中心坐标,默认为图像中心
Returns:
tuple: 包含以下元素的元组:
- rotated (np.ndarray): 旋转后的图像
- cos (float): 旋转角度的余弦值
- sin (float): 旋转角度的正弦值
- dW (int): 宽度变化量
- dH (int): 高度变化量
"""
(h, w) = image.shape[:2]
if center is None:
(cX, cY) = (w / 2, h / 2)
else:
(cX, cY) = center
M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])
nW = int((h * sin) + (w * cos))
nH = int((h * cos) + (w * sin))
M[0, 2] += (nW / 2) - cX
M[1, 2] += (nH / 2) - cY
rotated = cv2.warpAffine(image, M, (nW, nH))
# 计算偏移量
dW = nW - w
dH = nH - h
return rotated, cos, sin, dW, dH
def rotate_bound_4channels(image: np.ndarray, a: np.ndarray, angle: float, center=None):
"""
旋转4通道图像的函数
这是rotate_bound函数的4通道版本,可以同时处理RGB图像和其对应的alpha通道。
Args:
image (np.ndarray): 输入的3通道RGB图像
a (np.ndarray): 输入图像的alpha通道
angle (float): 旋转角度(度)
center (tuple, optional): 旋转中心坐标,默认为图像中心
Returns:
tuple: 包含以下元素的元组:
- input_image (np.ndarray): 旋转后的3通道RGB图像
- result_image (np.ndarray): 旋转后的4通道RGBA图像
- cos (float): 旋转角度的余弦值
- sin (float): 旋转角度的正弦值
- dW (int): 宽度变化量
- dH (int): 高度变化量
"""
input_image, cos, sin, dW, dH = rotate_bound(image, angle, center)
new_a, _, _, _, _ = rotate_bound(a, angle, center) # 对alpha通道进行旋转
b, g, r = cv2.split(input_image)
result_image = cv2.merge((b, g, r, new_a)) # 合并旋转后的RGB通道和alpha通道
return input_image, result_image, cos, sin, dW, dH
|