簡體   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