如何用不同颜色和字体的文本改善图像的OCR?

Rae*_*rji 6 python ocr python-imaging-library google-vision

我正在使用Google Vision API从某些图片中提取文本,但是,我一直在努力提高结果的准确性(可信度),但并不算幸运。

每次我从原始图像更改图像时,都会丢失检测某些字符的准确性。

我已经隔离了一个问题,使不同的单词具有多种颜色,例如,红色的单词比其他单词的错误结果更多。

例:

灰度或黑白图像上的某些变化

原始图片

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

我有什么想法可以使它更好地工作,特别是将文本的颜色更改为统一的颜色,或者将白色背景上的颜色更改为黑色,因为大多数算法都希望这样做?

我已经尝试过的一些想法,也有一些门槛。

dimg = ImageOps.grayscale(im)
cimg = ImageOps.invert(dimg)

contrast = ImageEnhance.Contrast(dimg)
eimg = contrast.enhance(1)

sharp = ImageEnhance.Sharpness(dimg)
eimg = sharp.enhance(1)
Run Code Online (Sandbox Code Playgroud)

Ste*_*ker 0

我需要更多关于此的背景信息。

  1. 您要对 Google Vision API 进行多少次调用?如果您在整个直播中都这样做,您可能需要付费订阅。
  2. 您将如何处理这些数据?OCR 需要多准确?
  3. 假设您从另一个人的抽搐流中获取此快照,处理流媒体的视频压缩和网络连接,您将获得非常模糊的快照,因此 OCR 将非常困难。

由于视频压缩,图像过于模糊,因此即使对图像进行预处理以提高质量,也可能无法获得足够高的图像质量以实现准确的 OCR。如果您决定使用 OCR,您可以尝试一种方法:

  1. 对图像进行二值化以获得白色的非红色文本和黑色背景,如二值化图像中一样:

    from PIL import Image
    
    def binarize_image(im, threshold):
    """Binarize an image."""
        image = im.convert('L')  # convert image to monochrome
        bin_im = image.point(lambda p: p > threshold and 255)
        return bin_im
    
    im = Image.open("game_text.JPG")
    binarized = binarize_image(im, 100)
    
    Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  1. 使用过滤器仅提取红色文本值,然后将其二值化:

    import cv2
    from matplotlib import pyplot as plt
    
    lower = [15, 15, 100]
    upper = [50, 60, 200]
    
    lower = np.array(lower, dtype = "uint8")
    upper = np.array(upper, dtype = "uint8")
    
    mask = cv2.inRange(im, lower, upper)
    red_binarized = cv2.bitwise_and(im, im, mask = mask)
    
    plt.imshow(cv2.cvtColor(red_binarized, cv2.COLOR_BGR2RGB))
    plt.show()
    
    Run Code Online (Sandbox Code Playgroud)

然而,即使进行了这种过滤,它仍然不能很好地提取红色。

在此输入图像描述

在此输入图像描述

  1. 添加在 (1.) 和 (2.) 中获得的图像。

    combined_image = binarized + red_binarized
    
    Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  1. 对 (3.) 进行 OCR