有人问过类似的问题,但是对于我来说,这些问题似乎都没有帮助(尽管如此,我还是从这些线程中学到了一些东西)。
我正在使用Tesseract进行OCR,但是当文本稍微偏斜时,结果并不令人满意(请参见上图)。
受类似情况的启发,我尝试使用OpenCV来检测和修复偏斜,但是不幸的是,它似乎不起作用。在下面,您可以看到我当前的尝试,但未产生必要的结果。我得到的只是图像周围的另一个边界框(已被裁剪)。
import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread("skew.JPG")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#gray = cv2.bitwise_not(gray)
ret,thresh1 = cv2.threshold(gray, 0, 255 ,cv2.THRESH_OTSU)
rect_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3
, 2))
dilation = cv2.dilate(thresh1, rect_kernel, iterations = 1)
cv2.imshow('dilation', dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()
contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img,[box],0,(0,0,255),3)
cv2.imshow('final', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我将不胜感激。
答案 0 :(得分:1)
当文本有些变形时,Tesseract似乎有很多麻烦。
此想法是找到文本轮廓以使图像不失真,然后使用Tesseract。
轮廓通常是一个矩形,该矩形与文本的变形相同。因此,它不再显示为图像中的完美矩形。 Opencv为您提供了不同的查找方法。 cv2.minAreaRect()
查找最佳旋转矩形。根据文本的变形,可能就足够了。否则,您可以使用cv2.convexHull()
来更好地适应您的文本。
轮廓应为您提供要重新映射到常规矩形的文本的角。您可以执行以下操作:
cv2.getAffineTransform(corners, dest_corners) # requires 3 points
cv2.getPerspectiveTransform(corners, dest_corners) # requires 4 points
然后
cv2.warpAffine(...)
cv2.warpPerspective(...)
此外,不要忘记正确设置Tesseract需要使用的页面分割方法(https://github.com/tesseract-ocr/tesseract/wiki/ImproveQuality)。在您的情况下,“ 6假设一个统一的文本块”。似乎适应了。