Python+OpenCV+图片旋转并用原底色填充新四角

1.开始使用的是下面这种旋转方法:

def rotate(pic):
	img = cv2.imread(pic)   
	# img = Image.open(pic)
	# img = np.array(img)
	height, width = img.shape[:2]
	degree = 5
	# 旋转后的尺寸
	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(img, matRotation, (widthNew, heightNew), borderValue=(255, 255, 255))

 仿射变换之后,borderValue可以设置边界的颜色,设置成255,255,255之后,边界没有黑边,但是图像实际是没有填满的,感觉很突兀:

看到的效果:                                                             实际的效果:

                              Python+OpenCV+图片旋转并用原底色填充新四角_第1张图片  

2.之后使用这种填充边界的方法:

def get_img_rot_broa(img, degree, filled_color=-1):
    """
    Desciption:
            Get img rotated a certain degree,
        and use some color to fill 4 corners of the new img.
    """
 
    # 获取旋转后4角的填充色
    if filled_color == -1:
        filled_color = mode([img[0, 0], img[0, -1],
                             img[-1, 0], img[-1, -1]]).mode[0]
    if np.array(filled_color).shape[0] == 2:
        if isinstance(filled_color, int):
            filled_color = (filled_color, filled_color, filled_color)
    else:
        filled_color = tuple([int(i) for i in filled_color])
 
    height, width = img.shape[:2]
 
    # 旋转后的尺寸
    height_new = int(width * fabs(sin(radians(degree))) +
                     height * fabs(cos(radians(degree))))
    width_new = int(height * fabs(sin(radians(degree))) +
                    width * fabs(cos(radians(degree))))
 
    mat_rotation = cv2.getRotationMatrix2D((width / 2, height / 2), degree, 1)
 
    mat_rotation[0, 2] += (width_new - width) / 2
    mat_rotation[1, 2] += (height_new - height) / 2
 
    # Pay attention to the type of elements of filler_color, which should be
    # the int in pure python, instead of those in numpy.
    img_rotated = cv2.warpAffine(img, mat_rotation, (width_new, height_new),
                                 borderValue=filled_color)
    # 填充四个角
    mask = np.zeros((height_new + 2, width_new + 2), np.uint8)
    mask[:] = 0
    seed_points = [(0, 0), (0, height_new - 1), (width_new - 1, 0),
                   (width_new - 1, height_new - 1)]
    for i in seed_points:
        cv2.floodFill(img_rotated, mask, i, filled_color)
 
    return img_rotated

if __name__=='__main__':
    pic=cv2.imread("test/contrast/ocr_4846387752.jpg")
    img_rotated=get_img_rot_broa(pic,degree=-5)
    cv2.imwrite('img_rotated.jpg',img_rotated)

虽然没有百分百的契合,但是也还行吧:

      

你可能感兴趣的:(python)