[英]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.