我有非常高分辨率的工程图/电路图,其中包含许多不同区域的文本。目的是从此类图像中提取文本。
我正在使用pytesseract来完成此任务。直接应用pytesseract是不可能的,因为在这种情况下,来自不同区域的文本会在输出中混乱。因此,我要确定包含文本的不同边界框,然后将这些区域迭代传递给pytesseract。边界框逻辑工作正常,但是有时我无法从裁剪的图像中得到任何文本,或者仅得到部分文本。我会了解裁剪后的图像是否为低分辨率或模糊,但事实并非如此。请查看随附的几个示例。
图片1
图片2
这是我获取文本的代码:
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<table width="90%">
<tr>
<td width="20%"><b>Factory Name</b></td>
<td width="50%"><input type="text" onkeyup="this.value = this.value.toUpperCase();" class="form-control" name="Fac_ID" required></td>
</tr>
</table>
<br>
<input type="submit" name="Submit" value="Add" class="btn btn-primary btn-block" onclick="return confirm('Do you want to add this factory?');">
</form>
第一张图片的实际结果-无输出(空白文本文件) 对于第二张图片-部分文字(所有其他配管和连接尺寸) 我想知道如何提高OCR的质量。如果需要,我也愿意使用任何其他工具(除了pytesseract之外)。但是不能使用API(Google,AWS等),因为这是一个限制。注意:我已经阅读了以下帖子,但与我的案例不重复,因为我在白色背景上有黑色文字:
答案 0 :(得分:0)
由于图像已经看起来很干净,因此无需进行预处理。一种简单的方法是在将图像丢入Pytesseract之前对阈值和高斯模糊进行平滑处理。这是经过简单处理的结果以及Pytesseract的输出
- 系统代码为3CAB,除非另有说明。
对于第二张图片
- 所有其他管道和连接尺寸 应为1英寸。除非另有说明。
我们使用--psm 6
配置标志,因为我们希望将图像视为单个统一的文本块。这是一些可能有用的其他configuration flags
代码
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
image = cv2.imread('2.jpg',0)
thresh = cv2.threshold(image, 150, 255, cv2.THRESH_BINARY_INV)[1]
result = cv2.GaussianBlur(thresh, (5,5), 0)
result = 255 - result
data = pytesseract.image_to_string(result, lang='eng',config='--psm 6')
print(data)
cv2.imshow('thresh', thresh)
cv2.imshow('result', result)
cv2.waitKey()