Python 扫描PDF图像中页码的识别

Python 扫描PDF图像中页码的识别,python,opencv,image-processing,ocr,tesseract,Python,Opencv,Image Processing,Ocr,Tesseract,我有很多PDF,基本上都是扫描过的文档或书籍,因此每个PDF页面都有两个扫描过的图像,我必须拆分这些页面,并根据页面上写入的打印页数进行组织。页面分割不是问题(我使用的是mutool海报),问题是:“如何从页面(图像)的PDF部分检测页码?” 下面是一个页面示例 我尝试过python+opencv+tesseract,但没有结果,因为我无法检测到数字的正确位置(它可以位于任何角落),或者如果opencv检测到位置,则tesseract无法检测到文本在您的问题中,opencv检测到位置,但tes

我有很多PDF,基本上都是扫描过的文档或书籍,因此每个PDF页面都有两个扫描过的图像,我必须拆分这些页面,并根据页面上写入的打印页数进行组织。页面分割不是问题(我使用的是mutool海报),问题是:“如何从页面(图像)的PDF部分检测页码?”

下面是一个页面示例


我尝试过python+opencv+tesseract,但没有结果,因为我无法检测到数字的正确位置(它可以位于任何角落),或者如果opencv检测到位置,则tesseract无法检测到文本

在您的问题中,opencv检测到位置,但tesseract无法读取文本,是否准确? 也许,您没有设置正确的参数或边界框。 您使用什么opencv函数来检测位置?tesseract参数是什么? 我将为页面制作一个除角之外的遮罩,并在这张“角”图像上使用tesseract。这样会减少噪音。

这里有一种方法

  • 将图像转换为灰度并反转图像
  • 放大以获得单个轮廓的字母
  • 寻找轮廓
  • 裁剪每个轮廓的ROI并放入pyteseract
  • 如果结果是数字,则保存ROI

转换为灰度并反转图像

image = cv2.imread('2.png')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = 255 - gray

现在我们扩展到将字母/轮廓连接在一起。其思想是页码轮廓将与页面上的其他字符分开,即使它可能位于任何角落

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
dilate = cv2.dilate(gray, kernel, iterations=4)

从这里我们找到轮廓,然后提取ROI。我们将每个ROI放入PyteSeract。如果返回的结果都是数字,那么我们检测到了页码ROI,这样我们就可以使用Numpy切片保存它

image_number = 0
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    ROI = original[y:y+h, x:x+w]
    data = pytesseract.image_to_string(ROI, lang='eng', config='--psm 10')
    if data.isdigit():
        print('Page #: ', data)
        cv2.imwrite("ROI_{}.png".format(image_number), ROI)
        image_number += 1

这是Pytesseract的结果和提取的ROI

第#:110页

完整代码

import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

image = cv2.imread('2.png')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = 255 - gray

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
dilate = cv2.dilate(gray, kernel, iterations=4)

cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

image_number = 0
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    ROI = original[y:y+h, x:x+w]
    data = pytesseract.image_to_string(ROI, lang='eng', config='--psm 10')
    if data.isdigit():
        print('Page #: ', data)
        cv2.imwrite("ROI_{}.png".format(image_number), ROI)
        image_number += 1

cv2.imshow('gray', gray)
cv2.imshow('dilate', dilate)
cv2.imshow('original', original)
cv2.waitKey()

我正在使用EAST文本检测器,并且我正在尝试检测图像中的所有矩形(这里是从页面中裁剪的框),我不知道遮罩是否有用,因为页码可以在中间,但最好对内容进行整形,并保留顶部和底部2个B框以供检测。对于tesseract,有此配置(-l个英文数字)您好,一切都进行得很顺利,直到我发现了一个具有这种页码的文档。opencv检测到bbox,但tesseract没有检测到文本,我能做什么?您能帮我吗?您可以做的一件事是,一旦提取bbox并获得ROI,您可以尝试形态学操作,例如侵蚀,以去除矩形框。B第二种方法是,一旦你得到了ROI,你可以使用轮廓区域过滤,提取出最小的轮廓,这个轮廓应该是数字,然后把它放到tesseract中