我正在尝试从手机屏幕截图中提取一些信息。尽管我的代码能够检索到一些信息,但并不是全部。我读取了转换为灰度的图像,然后移除了不需要的部分并应用了高斯阈值处理。但是,无法读取所有的文本。
import numpy as npimport cv2from PIL import Imageimport matplotlib.pyplot as pltimport pytesseractpytesseract.pytesseract.tesseract_cmd = r'C:\\Installs\\Tools\\Tesseract-OCR\\tesseract.exe'image = "C:\\Workspace\\OCR\\tesseract\\rpstocks1 - Copy (2).png"img = cv2.imread(image)img_grey = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)height, width, channels = img.shapeprint (height, width, channels)rec_img=cv2.rectangle(img_grey,(30,100),(1040,704),(0,255,0),3).copy()crop_img = rec_img[105:1945, 35:1035].copy()cv2.medianBlur(img,5)cv2.imwrite("C:\\Workspace\\OCR\\tesseract\\Cropped_GREY.jpg",crop_img)img_gauss = cv2.adaptiveThreshold(crop_img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,12)cv2.imwrite("C:\\Workspace\\OCR\\tesseract\\Cropped_Guass.jpg",img_gauss)text = pytesseract.image_to_string(img_gauss, lang='eng')text.encode('utf-8')print(text)
输出
图像尺寸 704 1080 3
投资
$9,712.99 ASRT _ 0500.46 shares ......... .. /0 GNUS 25169 Shares """"" " ‘27.98%
rpstocks1 – Copy (2).pngCropped_GREY.jpg
Cropped_Guass.jpg
回答:
请查看pytesseract
的页面分割模式,参见这个问答。例如,使用config='-psm 12'
已经可以获取到所有需要的文本。然而,这些图表也被某种程度上解释为文本。
因此,我会预处理图像以获取单个框(实际文本、图表、顶部信息等),然后过滤只存储那些包含感兴趣内容的框。这可以通过以下方式完成:
- 使用边界矩形的
y
坐标(不在图像上方5%的位置,即手机状态栏), - 使用边界矩形的宽度
w
(不超过图像宽度的50%,这些是水平线), - 使用边界矩形的
x
坐标(不在图像中间三分之一的位置,这些是图表)。
剩下的就是在每个裁剪的图像上运行pytesseract
,例如使用config='-psm 6'
(假设是一个统一的文本块),并清理文本中的任何换行符。
这将是我的代码:
这是输出结果:
['Investing', '$9,712.99', 'ASRT', '-27.64%', '500.46 shares', 'GNUS', '-27.98%', '251.69 shares']
由于你有边界矩形的位置信息,你还可以利用这些信息重新排列整个文本。
----------------------------------------系统信息----------------------------------------平台: Windows-10-10.0.16299-SP0Python: 3.9.1PyCharm: 2021.1.1OpenCV: 4.5.1pytesseract: 4.00.00alpha----------------------------------------