[英]Digit recognition in python (OpenCV and pytesseract)
我目前正在嘗試從小屏幕截圖中檢測數字。 但是,我發現准確性很差。 我一直在使用 OpenCV,圖像以 RGB 格式捕獲並轉換為灰度,然后使用全局值執行閾值處理(我發現自適應效果不太好)。
這是其中一個數字的灰度示例,然后是圖像后閾值保持的示例(數字范圍為 1-99)。 請注意,圖像的初始屏幕截圖非常小,因此被放大了。
非常感謝有關如何使用 OpenCV 或其他不同系統來提高准確性的任何建議。 下面包含的一些代碼,function 傳遞了數字的 RGB 屏幕截圖。
def getNumber(image):
image = cv2.resize(image, (0, 0), fx=3, fy=3)
img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh, image_bin = cv2.threshold(img, 125, 255, cv2.THRESH_BINARY)
image_final = PIL.Image.fromarray(image_bin)
txt = pytesseract.image_to_string(
image_final, config='--psm 13 --oem 3 -c tessedit_char_whitelist=0123456789')
return txt
這是我可以改進的地方,使用 otsu 閾值比給出任意值更有效地將文本與背景分開。 Tesseract 對白色背景上的黑色文本效果更好,而且我還添加了填充,因為如果字符太靠近邊界,則 tesseract 難以識別字符。
這是最終圖像 [final_image][1] 和 pytesseract 設法讀取“46”
import cv2,numpy,pytesseract
def getNumber(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Otsu Tresholding automatically find best threshold value
_, binary_image = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
# invert the image if the text is white and background is black
count_white = numpy.sum(binary_image > 0)
count_black = numpy.sum(binary_image == 0)
if count_black > count_white:
binary_image = 255 - binary_image
# padding
final_image = cv2.copyMakeBorder(image, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=(255, 255, 255))
txt = pytesseract.image_to_string(
final_image, config='--psm 13 --oem 3 -c tessedit_char_whitelist=0123456789')
return txt
Function 執行如下:
>> getNumber(cv2.imread(img_path))
編輯:請注意,您不需要這一行:
image_final = PIL.Image.fromarray(image_bin)
因為您可以將 numpy 數組格式(使用 cv2)的圖像傳遞給 pytesseractr,而 Tesseract 的精度只會下降 35 像素以下的字符(而且更大,35px 高度實際上是最佳高度)所以我沒有調整它的大小。 [1]: https://i.stack.imgur.com/OaJgQ.png
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.