[英]OCR not performing well on clean image | Python Pytesseract
我一直在從事涉及從圖像中提取文本的項目。 我研究過tesseract
是可用的最好的庫之一,我決定將其與opencv
一起使用。 圖像處理需要Opencv
。
我一直在玩tessaract
引擎,但它似乎並沒有給我預期的結果。 我已附上圖片作為參考。 我得到的輸出是:
1] =501 [
相反,預期的輸出是
TM10-50%L
到目前為止我做了什么:
還有其他改進算法的建議嗎?
提前致謝。
代碼片段:
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.