将刚才生成的代码修改:7.不将整个图像进行旋转,只将检测到的非水平和竖直黑色部分进行旋转使其变成水平或竖直
时间: 2024-03-28 17:41:53 浏览: 52
好的,针对您的要求,我们需要对之前生成的代码进行修改,具体步骤如下:
1. 首先,我们需要修改detect_angle函数中的代码,不再将整个图像进行旋转,只将检测到的非水平和竖直黑色部分进行旋转,使其变成水平或竖直。
2. 我们可以通过计算检测到的非水平和竖直线段的角度,然后将图像旋转相应的角度来实现这个功能。
3. 具体实现的代码如下:
```python
import cv2
import numpy as np
def detect_angle(img_path):
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
# 霍夫变换检测直线
lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi / 180, threshold=100, minLineLength=100, maxLineGap=10)
# 计算所有线段的平均角度
angles = []
for line in lines:
x1, y1, x2, y2 = line[0]
if x1 == x2 or y1 == y2:
continue
angle = np.arctan((y2 - y1) / (x2 - x1)) * 180 / np.pi
angles.append(angle)
if len(angles) == 0:
return 0
# 将所有角度转换为正值
angles = [abs(angle) for angle in angles]
# 计算所有角度的平均值
avg_angle = sum(angles) / len(angles)
# 将图像旋转到平均角度
rows, cols = img.shape[:2]
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), avg_angle, 1)
rotated_img = cv2.warpAffine(img, M, (cols, rows), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
return rotated_img
```
4. 以上代码中,我们首先通过霍夫变换检测图像中的直线,然后计算所有线段的角度,并将角度转换为正值。接着,我们计算所有角度的平均值,将图像旋转到平均角度。最后,返回旋转后的图像。
希望以上代码能够满足您的需求。
阅读全文