编辑:更好的方法可能是安装 tesseocr 包,因为它适用于最新的 Tesseract 版本。
康达:conda install -c conda-forge tesserocr
from tesserocr import PyTessBaseAPI, OEM, PSM
def get_angles2(img):
with PyTessBaseAPI( psm=PSM.OSD_ONLY, lang="osd", oem=OEM.TESSERACT_LSTM_COMBINED ) as api:
api.SetImage(img)
os = api.DetectOrientationScript()
if os['orient_deg'] == 0:
return 0
elif os['orient_deg'] > 90:
return 360-os['orient_deg']
else:
return -os['orient_deg']
原创
我的答案是基于计算霍夫变换生成的线之间的角度,因为我的数据集没有其他方法。这是一种快速的方法,结果证明在实践中效果很好。
此功能的先决条件是灰度、二值化和颜色反转。
import cv2
img = cv2.imread('test0.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
img = cv2.bitwise_not(img)
之后,您可以运行下面的函数并获取检测到的所有直通线的所有角度。请按照 OpenCV documentation 中的指定调整阈值参数(当前为 300):累加器阈值参数。仅返回那些获得足够票数 ( >threshold ) 的行。 有关计算 (x,y) 坐标上的角度的更多信息,请参阅此Stack Overflow。
import cv2
import numpy as np
def get_angles(img):
edges = cv2.Canny(img, 50, 150, apertureSize = 3)
lines = cv2.HoughLines(edges, 1, np.pi/180, threshold=300)
angles = []
for line in lines:
rho, theta = line[0]
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))
radians = np.arctan2(y2-y1, x2-x1)
degrees = np.degrees(radians)
angles.append(degrees)
return angles
运行此函数后,您将从霍夫变换中得到一长串角度。来自不应该旋转的图像:
[-90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -0.974421553508672, -0.974421553508672, -0.974421553508672, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.9749091578796124, 0.9749091578796124, 0.9749091578796124, 0.9749091578796124, 1.0030752389838637, 1.0030752389838637, 3.9855957480807316, 3.9875880958503185]
应该旋转的图像:
[-90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -90.0, -88.99692476101613, -88.99692476101613, -88.99692476101613, -88.99692476101613, -88.99692476101613, -88.99692476101613, -88.99692476101613, -88.99692476101613, -88.99692476101613, -88.99642282400909, -88.99642282400909, -88.02210297626898, -87.99346106671473, -87.99346106671473, -87.99346106671473, -87.99346106671473, -87.99346106671473, -87.99346106671473, -87.99346106671473, -87.99346106671473, -87.99346106671473, -87.99346106671473, -87.99346106671473, -87.99346106671473, -87.99245711203707, -87.99245711203707, -87.99245711203707, -87.99245711203707, -86.99022425882445, -86.99022425882445, -86.98871912968818, -86.98871912968818, -86.98871912968818, -86.98871912968818, -86.98871912968818, -86.98871912968818, -86.98871912968818, -86.98871912968818, -86.98871912968818, -86.98871912968818, -86.98871912968818, -86.98871912968818, -86.01440425191927, -86.01440425191927, -86.01440425191927, -86.01241190414969, -86.01241190414969, -86.01241190414969, -86.01241190414969, -86.01241190414969, -86.01241190414969, -86.01241190414969, -86.01241190414969, -86.01241190414969, -86.01241190414969, -86.01241190414969, -85.00791883390836, -85.00791883390836, -85.00791883390836, -85.00791883390836, -85.00542418989113, -85.00542418989113, -0.974421553508672, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.02866221847606629, 0.9749091578796124, 85.9838177634312, 86.98871912968818, 86.98871912968818, 86.98871912968818, 86.99022425882445, 87.99346106671473, 87.99346106671473, 87.99346106671473, 87.99346106671473, 87.99346106671473, 87.99346106671473, 87.99346106671473, 87.99346106671473, 88.99692476101613, 88.99692476101613, 88.99692476101613, 88.99692476101613, 88.99692476101613, 88.99692476101613, 88.99692476101613, 88.99692476101613]
在这里,我将留给您几个选项来选择旋转的角度。选项 3 应该适用于我上面介绍的数组,但请根据您的情况进行调整:
- 使用中间角旋转图片
- 第一个、中间和最后一个角度的平均值
- 求前 10 个和后 10 个值的平均值。如果差异太大,图像不需要旋转。但是,如果它们接近,则可以找到 20 个值(前 10 个和后 10 个)的平均值,并将其用作轮换值。
以下是我测试过但(对我而言)不起作用的指南列表。我相信如果包含财务数据(如方程式或表格),这些软件包中的大多数都不能很好地工作。但是,如果您的图片中只有文字,这些指南可能适合您:
- 对于需要旋转的图像和不需要旋转的图像,第一个都给了我 -90 度。 https://becominghuman.ai/how-to-automatically-deskew-straighten-a-text-image-using-opencv-a0c30aed83df
- 这在 Python 3 中产生了很多错误。修复代码后,结果发现根本不起作用。 https://mzucker.github.io/2016/08/15/page-dewarping.html
- 您可以在上面添加 Mousam Singh 的示例。这不起作用,因为 Tesseract 引发错误。此外,我不确定运行两次 Tesseract 是否明智。
- 这个包不适合我。这种方法太简单了。 https://github.com/sbrunner/deskew
- 值得一提的是我没有尝试过的 Leptonica,它被 Tesseract、OpenCV 和其他主要软件包使用。它需要管理一个我不想处理的依赖项,但是,如果您已经对 C 有一定的经验,它可能对您有用。https://tpgit.github.io/Leptonica/skew_8c.html