在Python中检测角度并旋转图像

在Python中检测角度并旋转图像,python,opencv,Python,Opencv,我想检测图(A)左侧的角度(即A),并将其旋转到正确的角度(即图b)。这张图片是一张答题纸 如何在Python中执行此操作?您可以使用OpenCV来检测图像中的线条。每条线的角度可从以下位置找到: import numpy as np import cv2 import math from scipy import ndimage img_before = cv2.imread('rotate_me.png') cv2.imshow("Before", img_befor

我想检测图(A)左侧的角度(即A),并将其旋转到正确的角度(即图b)。这张图片是一张答题纸

如何在Python中执行此操作?

您可以使用OpenCV来检测图像中的线条。每条线的角度可从以下位置找到:

import numpy as np
import cv2
import math
from scipy import ndimage

img_before = cv2.imread('rotate_me.png')

cv2.imshow("Before", img_before)    
key = cv2.waitKey(0)

img_gray = cv2.cvtColor(img_before, cv2.COLOR_BGR2GRAY)
img_edges = cv2.Canny(img_gray, 100, 100, apertureSize=3)
lines = cv2.HoughLinesP(img_edges, 1, math.pi / 180.0, 100, minLineLength=100, maxLineGap=5)

angles = []

for [[x1, y1, x2, y2]] in lines:
    cv2.line(img_before, (x1, y1), (x2, y2), (255, 0, 0), 3)
    angle = math.degrees(math.atan2(y2 - y1, x2 - x1))
    angles.append(angle)

cv2.imshow("Detected lines", img_before)    
key = cv2.waitKey(0)

median_angle = np.median(angles)
img_rotated = ndimage.rotate(img_before, median_angle)

print(f"Angle is {median_angle:.04f}")
cv2.imwrite('rotated.jpg', img_rotated)  
这将为您提供如下输出:

它显示检测到要旋转的线。计算的角度为:

角度为3.9793

如果您使用的是Python 3.4或更高版本,也可以使用它来代替numpy版本。

您的问题很广泛,并且它所属的主题不是标准Python的一部分。我建议您阅读有关opencv的内容。还有,你应该知道你的问题在SO中是离题的。非常感谢马丁·埃文斯,这对我帮助很大。我想找到角度,这是一个很好的答案。有没有办法在旋转后用相同的白色改变背景黑色?谢谢您,您可以尝试研究函数的
cval
参数。for循环不应该是[[x1,y1,x2,y2]]行中的
吗?
?顺便说一句,如果你写
print(…)
python3兼容;)@很抱歉打扰你马丁,我正试图用你的代码解决同样的问题。但说到OpenCV和图像处理,我完全不感兴趣。如果可能的话,你能解释一下是什么原因导致角度被计算为零吗?非常感谢。