opencv Tesseract无法清楚地获取数据

z4iuyo4d  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(101)
  • 在这个Python脚本中,首先我增加了图像分辨率,以提高OCR的准确性。
  • 其次,我对图像应用了许多滤镜,以增加对比度和文本清晰度。
  • 第三,我用Tesseract从过滤后的图像中提取文本,但是问题是Tesseract不能清楚地提取数据
  • 并尝试在pytesseract上添加页面分割模式和OCR引擎模式,但没有收到预期的输出。
  • 这是我的代码……
import os,argparse  
import pytesseract  
from pytesseract import Output  
import csv  
import numpy as np  
from PIL import Image  

image = cv2.imread('dota.jpg')

height = 9000
width = 16000

dimensions = (width, height)

image = cv2.resize(image,dimensions, interpolation=cv2.INTER_LINEAR)  
def get_grayscale(image):  
    return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
def adaptiveThreshold(image):  
    return cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
gray = get_grayscale(image)
sharpenKernel = np.array(([[2, -1, 2], [-1, 9, -1], [2, -1, 2]]), np.float32)/9
sharpen = cv2.filter2D(src=gray, kernel=sharpenKernel, ddepth=-1)
adthresh = adaptiveThreshold(sharpen)
cong = '--psm 6'  
final = pytesseract.image_to_data(adthresh,output_type=Output.DICT,config=cong,lang='eng')  
print(final['text'])
afdcj2ne

afdcj2ne1#

当对Tesseract OCR作业进行故障排除时,可以方便地在每个页面分割模式中运行一个循环,因为这些模式针对不同类型的输入进行了优化。这意味着Tesseract可以仅因为使用了正确/错误的PSM而产生显著的上级/低劣的结果。
例如,像这样的函数可以让您尝试不同的PSM,并测试一些基本图像预处理的效果。

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

def testTesseract(someFilename, psmValue=3, processABit=True):
    if processABit:
        img = np.array(pillowImageLoader.open(someFilename))
        norm_img = np.zeros((img.shape[0], img.shape[1]))
        img = cv2.normalize(img, norm_img, 0, 255, cv2.NORM_MINMAX)
        img = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)[1]
        img = cv2.GaussianBlur(img, (1, 1), 0)
    try:
        someText = pytesseract.image_to_string(someFilename, config='--psm {}'.format(psmValue))
        return someText
    except:
        return None

然后运行每个psm并检查输出:

for i in range(1,14):
    someText = testTesseract(imageFilename, i, processABit=True)
    print("PSM: {}".format(i))
    print(someText
    print("="*40)

我通常在扫描文本(文档)上使用Tesseract,但我发现它在查找图像中的文本(例如,从照片中阅读路标的文本,或从屏幕截图中提取文本)方面没有那么好。
我发现PaddleOCR在最具挑战性的OCR任务中通常要好得多,而且用途:

from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang='en',use_gpu=False)
result = ocr.ocr(imageFilename, cls=True)
print("Paddle Found: {} text segments".format(len(result[0])))
print()
for t in result[0]:
        print("{}  (Conf: {:.1%})".format(t[1][0], t[1][1]))

相关问题