簡體   English   中英

如何使用 OCR 檢測圖像中的下標數字?

[英]How to detect subscript numbers in an image using OCR?

我通過pytesseract綁定將tesseract用於 OCR。 不幸的是,我在嘗試提取包含下標樣式數字的文本時遇到了困難——下標數字被解釋為一個字母。

例如,在基本圖像中:

在此處輸入圖像描述

我想將文本提取為“CH3”,即我不關心知道數字3是圖像中的下標。

我使用tesseract的嘗試是:

import cv2
import pytesseract

img = cv2.imread('test.jpeg')

# Note that I have reduced the region of interest to the known 
# text portion of the image
text = pytesseract.image_to_string(
    img[200:300, 200:320], config='-l eng --oem 1 --psm 13'
)
print(text)

不幸的是,這將錯誤地 output

'CHs'

也可以得到'CHa' ,這取決於psm參數。

我懷疑這個問題與文本的“基線”不一致有關,但我不確定。

我怎樣才能准確地從這種類型的圖像中提取文本?

更新 - 2020 年 5 月 19 日

在看到 Achintha Ihalage 的答案后,它沒有為tesseract提供任何配置選項,我探索了psm選項。

由於感興趣的區域是已知的(在這種情況下,我使用 EAST 檢測來定位文本的邊界框),因此tesseractpsm配置選項(在我的原始代碼中將文本視為單行)可能不是必要的。 針對上面邊界框給出的感興趣區域運行image_to_string會得到 output

CH

3

當然,可以很容易地處理得到CH3

這是因為下標字體太小了。 您可以使用 python package(例如cv2PIL )調整圖像大小,並將調整后的圖像用於 OCR,如下所示。

import pytesseract
import cv2

img = cv2.imread('test.jpg')
img = cv2.resize(img, None, fx=2, fy=2)  # scaling factor = 2

data = pytesseract.image_to_string(img)
print(data)

OUTPUT:

CH3

您希望在將圖像輸入tesseract之前對圖像進行預處理,以提高 OCR 的准確性。 我在這里使用PILcv2的組合來執行此操作,因為cv2具有良好的模糊/噪聲去除過濾器(膨脹、侵蝕、閾值),並且PIL可以輕松增強對比度(區分文本和背景),我想展示如何使用...進行預處理(盡管兩者一起使用並不是 100% 必要的,如下所示)。 你可以寫得更優雅——這只是一般的想法。

import cv2
import pytesseract
import numpy as np
from PIL import Image, ImageEnhance


img = cv2.imread('test.jpg')

def cv2_preprocess(image_path):
  img = cv2.imread(image_path)

  # convert to black and white if not already
  img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

  # remove noise
  kernel = np.ones((1, 1), np.uint8)
  img = cv2.dilate(img, kernel, iterations=1)
  img = cv2.erode(img, kernel, iterations=1)

  # apply a blur 
  # gaussian noise
  img = cv2.threshold(cv2.GaussianBlur(img, (9, 9), 0), 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

  # this can be used for salt and pepper noise (not necessary here)
  #img = cv2.adaptiveThreshold(cv2.medianBlur(img, 7), 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2)

  cv2.imwrite('new.jpg', img)
  return 'new.jpg'

def pil_enhance(image_path):
  image = Image.open(image_path)
  contrast = ImageEnhance.Contrast(image)
  contrast.enhance(2).save('new2.jpg')
  return 'new2.jpg'


img = cv2.imread(pil_enhance(cv2_preprocess('test.jpg')))


text = pytesseract.image_to_string(img)
print(text)

Output:

CH3

cv2預處理生成的圖像如下所示: 在此處輸入圖像描述

PIL的增強功能為您提供:

在此處輸入圖像描述

在這個特定示例中,您實際上可以在cv2_preprocess步驟之后停止,因為這對讀者來說已經足夠清楚了:

img = cv2.imread(cv2_preprocess('test.jpg'))
text = pytesseract.image_to_string(img)
print(text)

output:

CH3

但是,如果您正在處理不一定以白色背景開始的事物(即灰度轉換為淺灰色而不是白色) - 我發現PIL步驟確實有幫助。

要點是提高tesseract准確性的方法通常是:

  1. 修復 DPI(重新縮放)
  2. 修復圖像的亮度/噪聲
  3. 修復 tex 大小/線條(傾斜/扭曲文本)

執行其中一項或全部三項將有所幫助……但亮度/噪音可能比其他兩項更普遍(至少根據我的經驗)。

我認為這種方式可以更適合一般情況。

import cv2
import pytesseract
from pathlib import Path

image = cv2.imread('test.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]  # (suitable for sharper black and white pictures
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]  # is OpenCV2.4 or OpenCV3
result_list = []
for c in contours:
    x, y, w, h = cv2.boundingRect(c)
    area = cv2.contourArea(c)
    if area > 200:
        detect_area = image[y:y + h, x:x + w]
        # detect_area = cv2.GaussianBlur(detect_area, (3, 3), 0)
        predict_char = pytesseract.image_to_string(detect_area, lang='eng', config='--oem 0 --psm 10')
        result_list.append((x, predict_char))
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), thickness=2)

result = ''.join([char for _, char in sorted(result_list, key=lambda _x: _x[0])])
print(result)  # CH3


output_dir = Path('./temp')
output_dir.mkdir(parents=True, exist_ok=True)
cv2.imwrite(f"{output_dir/Path('image.png')}", image)
cv2.imwrite(f"{output_dir/Path('clean.png')}", thresh)

更多參考

我強烈建議您參考以下示例,這是 OCR 的有用參考。

  1. 使用 opencv 獲取圖像中所有文本的位置
  2. 使用 YOLO 或其他圖像識別技術來識別圖像中存在的所有字母數字文本

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM