Python实现图片任意角度旋转及无黑边裁剪
在图像处理过程中,有时候我们需要对图像进行旋转操作,但是通常情况下我们只能进行90度的旋转,因此如果需要进行任意角度的旋转,就需要通过一定的技巧来实现。同时,由于旋转可能会导致图片出现黑边,因此我们也需要对旋转后的图片进行裁剪,保留最大的图像内容。
本文将介绍如何使用Python的OpenCV库对图片进行任意角度旋转,并裁剪出最大无黑边的图像。
准备工作
在开始之前,我们需要确保已经安装了OpenCV库。如果没有安装的话,可以使用以下命令进行安装:
pip install opencv-python
图像旋转
首先,我们需要编写一个函数来实现图像的任意角度旋转:
import cv2
import numpy as np
def rotate_image(image, angle):
# 获取图像的高度和宽度
height, width = image.shape[:2]
# 计算旋转中心点
center = (width // 2, height // 2)
# 获取旋转矩阵
rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1.0)
# 对图像进行旋转
rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))
return rotated_image
这个函数接受两个参数,分别是需要旋转的图像和旋转的角度。然后函数会返回旋转后的图像。
下面我们来测试一下这个函数,先加载一张图片:
image = cv2.imread('test.jpg')
然后进行45度的旋转:
rotated_image = rotate_image(image, 45)
cv2.imshow('Rotated Image', rotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行以上代码,可以看到原始图片被旋转了45度后显示出来。
裁剪无黑边图像
接下来,我们需要编写一个函数来裁剪旋转后的图像,使得最终图像无黑边:
def crop_image(image):
# 将图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 寻找图像的边界
_, thresh = cv2.threshold(gray, 1, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 计算图像的边界框
x, y, w, h = cv2.boundingRect(contours[0])
# 裁剪图像
cropped_image = image[y: y + h, x: x + w]
return cropped_image
这个函数接受一个旋转后的图像作为参数,并返回裁剪后的图像。
下面我们来测试一下这个函数,使用之前旋转后的图片作为输入:
cropped_image = crop_image(rotated_image)
cv2.imshow('Cropped Image', cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行以上代码,可以看到裁剪后的图像已经没有黑边,并且是图像中的最大内容。
结语
通过本文介绍的方法,我们可以方便地对图像进行任意角度的旋转,并且在旋转后进行无黑边的裁剪。这对于图像处理中的一些特定需求会非常有帮助。