繁体   English   中英

OCR 在干净的图像上表现不佳 | Python Pytesseract

[英]OCR not performing well on clean image | Python Pytesseract

我一直在从事涉及从图像中提取文本的项目。 我研究过tesseract是可用的最好的库之一,我决定将其与opencv一起使用。 图像处理需要Opencv

我一直在玩tessaract引擎,但它似乎并没有给我预期的结果。 我已附上图片作为参考。 我得到的输出是:

1] =501 [

相反,预期的输出是

TM10-50%L

到目前为止我做了什么:

  • 消除噪音
  • 自适应阈值
  • 发送 tesseract ocr 引擎

还有其他改进算法的建议吗?

提前致谢。

代码片段:

import cv2
import sys
import pytesseract
import numpy as np
from PIL import Image

if __name__ == '__main__':
  if len(sys.argv) < 2:
    print('Usage: python ocr_simple.py image.jpg')
    sys.exit(1)

  # Read image path from command line
  imPath = sys.argv[1]
  gray  = cv2.imread(imPath, 0)
  # Blur
  blur  = cv2.GaussianBlur(gray,(9,9), 0)
  # Binarizing
  thres = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 3)
  text = pytesseract.image_to_string(thresh)
  print(text)

附上图片。 第一个图像是原始图像。 原始图像

第二张图片是输入到tessaract的图片。 输入到 tessaract

在对图像执行 OCR 之前,对图像进行预处理很重要。 这个想法是获得一个处理过的图像,其中要提取的文本是黑色的,背景是白色的。 对于这个特定的图像,我们需要在 OCR 之前获得 ROI。

为此,我们可以转换为灰度,应用轻微的高斯模糊,然后自适应阈值以获得二值图像。 从这里,我们可以应用形态闭合来将单个字母合并在一起。 接下来我们找到轮廓,使用轮廓区域过滤进行过滤,然后提取 ROI。 我们使用--psm 6配置选项执行文本提取,以假设单个统一的文本块。 在这里查看更多选项。


检测到的投资回报率

在此处输入图像描述

提取的投资回报率

在此处输入图像描述

Pytesseract OCR 的结果

TM10=50%L

代码

import cv2
import pytesseract

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

# Grayscale, Gaussian blur, Adaptive threshold
image = cv2.imread('1.jpg')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 5, 5)

# Perform morph close to merge letters together
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=3)

# Find contours, contour area filtering, extract ROI
cnts, _ = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:]
for c in cnts:
    area = cv2.contourArea(c)
    if area > 1800 and area < 2500:
        x,y,w,h = cv2.boundingRect(c)
        ROI = original[y:y+h, x:x+w]
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 3)

# Perform text extraction
ROI = cv2.GaussianBlur(ROI, (3,3), 0)
data = pytesseract.image_to_string(ROI, lang='eng', config='--psm 6')
print(data)

cv2.imshow('ROI', ROI)
cv2.imshow('close', close)
cv2.imshow('image', image)
cv2.waitKey()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM