簡體   English   中英

無法使用 pytesseract.image_to_string 從圖像中讀取文本

[英]Unable to read text from Image using pytesseract.image_to_string

這就是驗證碼的樣子。

這里的問題是我需要刪除這些行並編寫代碼來識別字符。 到目前為止,我已經看到了解決方案,其中 char 是實心的,但是這個 char 有雙邊框。

對於這個特定的驗證碼,有一個非常簡單的解決方案。 但是,由於評論中已經提到驗證碼的“性質”,並且通常在處理提供有限輸入數據的圖像處理任務時,不能保證這種方法適用於其他甚至非常相似的驗證碼。

  • 將圖像讀取為灰度。

  • 將圖像閾值設置為接近白色的截止點。

    閾值

  • 洪水用黑色填充“背景”。

    洪水填滿

  • 使用-psm 6選項運行pytesseract

這就是整個代碼:

import cv2
import pytesseract

# Read image as grayscale
img = cv2.imread('FuZEJ.png', cv2.IMREAD_GRAYSCALE)

# Threshold at nearly white cutoff
thr = cv2.threshold(img, 224, 255, cv2.THRESH_BINARY)[1]

# Floodfill "background" with black
ff = cv2.floodFill(thr, None, (0, 0), 0)[1]

# OCR using pytesseract
text = pytesseract.image_to_string(ff, config='--psm 6').replace('\n', '').replace('\f', '')
print(text)
# xwphs

警告:我使用曼海姆大學圖書館的特殊版本的 Tesseract。

----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.16299-SP0
Python:        3.9.1
PyCharm:       2021.1.1
OpenCV:        4.5.1
pytesseract:   5.0.0-alpha.20201127
----------------------------------------

我會嘗試一個面具:

import cv2
import numpy as np

def process(img): # To process the image
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    _, img_gray = cv2.threshold(img_gray, 224, 255, cv2.THRESH_TOZERO_INV)
    img_blur = cv2.GaussianBlur(img_gray, (7, 7), 6)
    img_canny = cv2.Canny(img_blur, 0, 100)
    return cv2.dilate(img_canny, np.ones((1, 5)), iterations=1)

def get_mask(img): # To generate the mask
    mask = np.zeros(img.shape[:2], 'uint8')
    contours, _ = cv2.findContours(process(img), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    for cnt in contours:
        cv2.drawContours(mask, [cnt], -1, 255, -1)
    return mask

def crop(img, mask): # To mask an image and use white background
    bg = np.full(img.shape, 255, 'uint8')
    fg = cv2.bitwise_or(img, img, mask=mask)            
    fg_back_inv = cv2.bitwise_or(bg, bg, mask=cv2.bitwise_not(mask))
    return cv2.bitwise_or(fg, fg_back_inv)

img = cv2.imread("image.png")
img = cv2.pyrUp(cv2.pyrUp(img)) # To enlarge image by 4x
cv2.imshow("Masked Image", crop(img, get_mask(img)))
cv2.waitKey(0)

前:

在此處輸入圖像描述

后:

在此處輸入圖像描述

暫無
暫無

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

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