cv2 文档 倾斜 矫正
时间: 2023-05-26 14:01:50 浏览: 95
倾斜矫正是一种将图像中的倾斜角度纠正为水平或垂直方向的操作。在OpenCV中,可以使用以下步骤实现倾斜矫正:
1. 通过cv2.imread()函数读取要矫正的图像。
2. 将图像转换为灰度图像。
3. 在灰度图像中应用Canny算法检测边缘。
4. 将检测到的边缘传递给cv2.HoughLines()函数,找到图像中的直线。
5. 存储这些直线的端点,计算每个线段的角度和长度。
6. 基于所有线段的数量和角度,找到图像中的主要线段,这是水平或垂直线段。
7. 计算主要线段的角度并将其旋转至垂直或水平方向。
8. 通过使用cv2.warpAffine()函数将图像旋转到正确的位置。
以下是一个完整的代码示例:
```python
import cv2
import numpy as np
# 读入图像
img = cv2.imread('image.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测边缘
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
# 检测直线
lines = cv2.HoughLines(edges, 1, np.pi/180, 200)
# 存储直线端点,并计算角度和长度
points = []
angles = []
lengths = []
for line in lines:
for rho, theta in line:
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
x1 = int(x0 + 1000*(-b))
y1 = int(y0 + 1000*(a))
x2 = int(x0 - 1000*(-b))
y2 = int(y0 - 1000*(a))
points.append([(x1, y1), (x2, y2)])
angle = np.abs(theta-np.pi/2)
if angle > np.pi/2:
angle = np.pi - angle
angles.append(angle)
lengths.append(np.sqrt((x2-x1)**2 + (y2-y1)**2))
# 根据线段角度和数量找到主要线段
median_angle = np.median(angles)
angles_diff = np.abs(angles - median_angle)
median_length = np.median(lengths)
lengths_diff = np.abs(lengths - median_length)
idx_angle = np.argmin(angles_diff)
idx_length = np.argmin(lengths_diff)
if idx_angle == idx_length:
main_line = points[idx_angle]
else:
main_line = points[int((idx_angle+idx_length)/2)]
# 计算主要线段角度并旋转图像
x1, y1 = main_line[0]
x2, y2 = main_line[1]
angle = np.arctan2(y2-y1, x2-x1) * 180 / np.pi
rotated = cv2.warpAffine(img, cv2.getRotationMatrix2D((img.shape[1]/2, img.shape[0]/2), angle, 1), (img.shape[1], img.shape[0]))
# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Rotated Image', rotated)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
阅读全文