如何在Python中使用OpenCV库实现图片90度精确旋转而不产生黑边?请提供详细的步骤和代码示例。
时间: 2024-12-01 14:17:47 浏览: 42
在Python中,使用OpenCV库实现图片90度旋转而不产生黑边的关键在于先旋转图片,然后找到旋转后图像的新边界,并在此基础上裁剪图像。以下是实现这一过程的详细步骤和代码示例:
参考资源链接:[Python+OpenCV:实现图片90°无损旋转无黑边](https://wenku.csdn.net/doc/645caa7a59284630339a48a8?spm=1055.2569.3001.10343)
1. **读取原始图像**:首先,使用OpenCV的`cv2.imread()`函数读取你要旋转的图片。
2. **计算旋转矩阵**:使用`cv2.getRotationMatrix2D()`函数计算旋转90度的旋转矩阵。例如,旋转90度顺时针可以使用中心点坐标和旋转角度参数(540度,中心点,1.0)。
3. **执行旋转操作**:使用`cv2.warpAffine()`函数应用旋转矩阵,进行实际的图片旋转操作。
4. **确定新边界并裁剪**:通过遍历旋转后的图像,找到最左、最右、最上和最下边缘,确定图像内容的新边界。然后,根据这个新边界创建一个与原图像同样类型的空白图像。最后,将旋转后图片的有效部分(不包含黑边的部分)复制到这个新图像上。
5. **保存或显示结果**:使用`cv2.imwrite()`函数保存最终无黑边的旋转图像,或者使用`cv2.imshow()`函数显示图像。
示例代码如下:
```python
import cv2
import numpy as np
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 计算旋转矩阵
rows, cols = image.shape[:2]
center = (cols // 2, rows // 2)
rotation_matrix = cv2.getRotationMatrix2D((cols // 2, rows // 2), 540, 1.0)
# 应用旋转矩阵
rotated_image = cv2.warpAffine(image, rotation_matrix, (cols, rows))
# 确定新边界
x_min = np.min(np.nonzero(rotated_image[:, :, 0]) [1])
y_min = np.min(np.nonzero(rotated_image[:, :, 0]) [0])
x_max = np.max(np.nonzero(rotated_image[:, :, 0]) [1])
y_max = np.max(np.nonzero(rotated_image[:, :, 0]) [0])
# 创建新的空白图像
new_image = rotated_image[y_min:y_max, x_min:x_max]
# 保存或显示结果
cv2.imwrite('rotated_image.jpg', new_image)
# cv2.imshow('Rotated Image', new_image)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
```
在这段代码中,我们首先旋转了图像,然后通过遍历和寻找最小和最大边界来找到旋转后图像的内容边界,并在这个基础上裁剪了旋转图像,从而消除了旋转过程中产生的黑边。这样,我们就可以获得一个无黑边的90度精确旋转图片。
参考资源链接:[Python+OpenCV:实现图片90°无损旋转无黑边](https://wenku.csdn.net/doc/645caa7a59284630339a48a8?spm=1055.2569.3001.10343)
阅读全文