These two methods may produce some different effects when rotating images:
rotate_image_new()The rotated image completely contains the content before rotation, and the padding boundary is as small as possible
rotate_image() maintains the size of the original image and decides whether to fill the border with white depending on the padding options. If the if_fill_white parameter is True, the fill border is white; otherwise, the border retains the original image's values. This method rotates the image more quickly, but may result in the rotated image containing extra white space or losing some image information.
def rotate_image_new(image, degree):
'''
旋转图片角度
'''
from math import *
# dividing height and width by 2 to get the center of the image
height, width = image.shape[:2]
heightNew = int(width * fabs(sin(radians(degree))) + height * fabs(cos(radians(degree))))
widthNew = int(height * fabs(sin(radians(degree))) + width * fabs(cos(radians(degree))))
matRotation = cv2.getRotationMatrix2D((width / 2, height / 2), degree, 1)
matRotation[0, 2] += (widthNew - width) / 2 # 重点在这步,目前不懂为什么加这步
matRotation[1, 2] += (heightNew - height) / 2 # 重点在这步
imgRotation = cv2.warpAffine(image, matRotation, (widthNew, heightNew), borderValue=(255, 255, 255))
return imgRotation
def rotate_image( image, angle,if_fill_white = False):
'''
顺时针旋转
'''
# dividing height and width by 2 to get the center of the image
height, width = image.shape[:2]
# get the center coordinates of the image to create the 2D rotation matrix
center = (width / 2, height / 2)
# using cv2.getRotationMatrix2D() to get the rotation matrix
rotate_matrix = cv2.getRotationMatrix2D(center=center, angle=angle, scale=1)
# rotate the image using cv2.warpAffine
if not if_fill_white:
rotated_image = cv2.warpAffine(src=image, M=rotate_matrix, dsize=(width, height) )
else:
color = (255, 255) if len(image.shape)==2 else (255, 255,255)
rotated_image = cv2.warpAffine(src=image, M=rotate_matrix, dsize=(width, height), borderValue=color)
return rotated_image