簡體   English   中英

當使用 Gimp 手動預處理圖像時,使用 Tesseract-OCR 的圖像到文本識別比我的 Python 代碼更好

[英]Image to text recognition using Tesseract-OCR is better when Image is preprocessed manually using Gimp than my Python Code

我正在嘗試用 Python 編寫代碼,以便使用 Tesseract-OCR 進行手動圖像預處理和識別。

手動過程:
為了手動識別單個圖像的文本,我使用 Gimp 預處理圖像並創建一個 TIF 圖像。 然后我將它提供給 Tesseract-OCR,它可以正確識別它。

要使用 Gimp 預處理圖像,我會這樣做 -

  1. 將模式更改為 RGB / 灰度
    菜單——圖像——模式——RGB
  2. 閾值
    菜單——工具——顏色工具——閾值——自動
  3. 將模式更改為索引
    菜單——圖像——模式——索引
  4. 調整大小/縮放到寬度 > 300 像素
    菜單 -- 圖片 -- 縮放圖片 -- 寬度=300
  5. 另存為 Tif

然后我喂它tesseract -

$ tesseract captcha.tif output -psm 6

而且我一直都能得到准確的結果。

蟒蛇代碼:
我嘗試使用 OpenCV 和 Tesseract 復制上述過程 -

def binarize_image_using_opencv(captcha_path, binary_image_path='input-black-n-white.jpg'):
    im_gray = cv2.imread(captcha_path, cv2.CV_LOAD_IMAGE_GRAYSCALE)
    (thresh, im_bw) = cv2.threshold(im_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
    # although thresh is used below, gonna pick something suitable
    im_bw = cv2.threshold(im_gray, thresh, 255, cv2.THRESH_BINARY)[1]
    cv2.imwrite(binary_image_path, im_bw)

    return binary_image_path

def preprocess_image_using_opencv(captcha_path):
    bin_image_path = binarize_image_using_opencv(captcha_path)

    im_bin = Image.open(bin_image_path)
    basewidth = 300  # in pixels
    wpercent = (basewidth/float(im_bin.size[0]))
    hsize = int((float(im_bin.size[1])*float(wpercent)))
    big = im_bin.resize((basewidth, hsize), Image.NEAREST)

    # tesseract-ocr only works with TIF so save the bigger image in that format
    tif_file = "input-NEAREST.tif"
    big.save(tif_file)

    return tif_file

def get_captcha_text_from_captcha_image(captcha_path):

    # Preprocess the image befor OCR
    tif_file = preprocess_image_using_opencv(captcha_path)

    #   Perform OCR using tesseract-ocr library
    # OCR : Optical Character Recognition
    image = Image.open(tif_file)
    ocr_text = image_to_string(image, config="-psm 6")
    alphanumeric_text = ''.join(e for e in ocr_text)

    return alphanumeric_text    

但我沒有得到同樣的准確度。 我錯過了什么?

更新 1:

  1. 原圖
    在此處輸入圖片說明
  2. 使用 Gimp 創建的 Tif 圖像
    在此處輸入圖片說明
  3. 由我的 python 代碼創建的 Tif 圖像
    在此處輸入圖片說明

更新 2:

此代碼可在https://github.com/hussaintamboli/python-image-to-text 獲得

如果輸出與您的預期輸出(即額外的 '," 等,如您的評論中所建議的那樣)只是最小偏差,請嘗試將字符識別限制為您期望的字符集(例如字母數字)。

您已經應用了簡單閾值。 缺少的部分是您需要一張一張地閱讀圖像

對於每個個位數

    1. 上采樣
    1. 添加邊框

准確識別需要上采樣。 為圖像添加邊框將使數字居中。

在此處輸入圖片說明 在此處輸入圖片說明 在此處輸入圖片說明 在此處輸入圖片說明 在此處輸入圖片說明 在此處輸入圖片說明
8 8 C 7 F

代碼:


import cv2
import pytesseract

img = cv2.imread('Iv5BS.jpg')
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thr = cv2.threshold(gry, 128, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

(h_thr, w_thr) = thr.shape[:2]
s_idx = 2
e_idx = int(w_thr/6) - 20
result = ""

for _ in range(0, 6):
    crp = thr[5:int((6*h_thr)/7), s_idx:e_idx]
    (h_crp, w_crp) = crp.shape[:2]
    crp = cv2.resize(crp, (w_crp*2, h_crp*2))
    crp = cv2.copyMakeBorder(crp, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=255)
    s_idx = e_idx
    e_idx = s_idx + int(w_thr/6) - 7
    txt = pytesseract.image_to_string(crp, config="--psm 6")
    result += txt[0]
    cv2.imshow("crp", crp)
    cv2.waitKey(0)

print(result)

結果

88BC7F

暫無
暫無

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

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