簡體   English   中英

使用 OpenCV 和 Python 識別數字(簡單數字 OCR)

[英]Recognizing digits with OpenCV and Python (Simple digit OCR)

因此,我正在嘗試創建一個程序,該程序可以查看圖像的編號並在控制台中打印整數。 (我正在使用python 3)

例如,程序識別出下面的圖像(程序必須檢查的實際圖像)是 2 號:

2號

我試圖將它與另一個圖像與cv2.matchTemplate()進行比較,但每次藍色像素 rgb 值對於每個圖像都有一點不同,並且圖像可能會更大或更小。 例如下圖:

2號

除了所有其他藍色數字圖像(0-9)之外,它還必須識別它,例如以下一個:

5 號

我嘗試了多個匹配模板代碼,並制作了一個包含數字 0-9 圖像的文件夾作為模板,但每次幾乎每個數字都被識別為需要識別的數字。 例如,數字 5 在數字 2 的圖像中被識別。如果它不能識別所有這些,它會識別錯誤的圖像。

我試過的那些:

但就像我之前說的那樣,它帶來了這些問題。

我還嘗試查看每張圖像中藍色的百分比,但這些數字要接近才能通過查看其中藍色的含量來區分數字。

有沒有人有辦法解決嗎? 我使用cv2.matchTemplate()是不是很愚蠢,有沒有更簡單的選擇? (我不介意為它使用庫,因為這是一段更大的代碼的一部分,但我更喜歡編寫它,而不是庫)

而不是使用模板匹配,更好的方法是使用Pytesseract OCR通過 image_to_string image_to_string()讀取數字。 但在執行 OCR 之前,您需要對圖像進行預處理。 為獲得最佳 OCR 性能,預處理圖像應具有黑色 OCR 所需的文本/數字/字符,背景為白色 一個簡單的預處理步驟是將圖像轉換為灰度、Otsu 的閾值以獲得二值圖像,然后將圖像反轉。 這是預處理步驟的可視化:

輸入圖像->灰度-> Otsu 的閾值->准備 OCR 的反轉圖像

在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述

Pytesseract OCR 的結果

2

這是其他圖像的結果:

在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述

2

在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述

5

我們使用--psm 6配置選項來假設一個統一的文本塊。 有關更多配置選項,請參見此處

代碼

import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

# Load image, grayscale, Otsu's threshold, then invert
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
invert = 255 - thresh

# Perfrom OCR with Pytesseract
data = pytesseract.image_to_string(invert, lang='eng', config='--psm 6')
print(data)

cv2.imshow('thresh', thresh)
cv2.imshow('invert', invert)
cv2.waitKey()

注意:如果您堅持使用模板匹配,則需要使用比例變體模板匹配。 看看如何隔離輪廓內的所有內容,對其進行縮放,並測試與圖像的相似性? Python OpenCV 線檢測以檢測圖像中的 X 符號以獲取一些示例。 如果您確定您的圖像是藍色的,那么另一種方法是使用帶有cv2.inRange()的顏色閾值來獲得二進制蒙版圖像,然后在圖像上應用 OCR。

鑒於可愛的常規輸入,我希望您所需要的只是與模板進行簡單比較。 由於您忽略了提供代碼和輸出,因此很難判斷可能出了什么問題。

很簡單...

  • 將您的輸入重新調整為大小或模板。
  • 使用 10 個模板中的每一個計算對輸入的任何直接匹配評估。 一個簡單的匹配計數就足夠了:兩個圖像之間有多少像素匹配。
  • 得分最高的模板是標識。

您可能還希望為聲明匹配設置一個較低的閾值,可能基於該模板與其他每個模板的匹配程度:任何標識都必須明顯超過兩個不同模板之間的匹配。

如果您無法訪問 OCR 引擎,只需知道您可以通過 KNN 分類器構建自己的 OCR 系統。 在此示例中,實現應該不是很困難,因為您只是對數字進行分類。 OpenCV 提供了一個非常簡單的 KNN 實現。

分類器使用從已知類實例的樣本計算的特征進行訓練。 在這種情況下,您有 10 個類(如果您使用數字 0 - 9),因此您可以使用您的數字准備一個“模板”,提取一些特征,訓練分類器並使用它來分類新實例。

所有這些都可以在 OpenCV 中完成,無需額外的庫,並且 KNN(對於這種應用程序)具有超過可接受的准確率。

暫無
暫無

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

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