首页 > 解决方案 > Python Cv2 Tesseract 提高粗数字的可读性?

问题描述

我的图像对屏幕上的数字大约有 50% 的正确性。

数字看起来像这样。

测试3

我的代码给了我这个结果 [164609, 7097394, 2259]

我怎样才能改进我的代码,让它读起来更准确?我尝试上下改变白色色调,结果好坏参半。我已经尝试更改我的 PSM 和 OEM 设置。

with mss.mss() as sct:
    region = {
        'left': 3577,
        'top': 146,
        'width': 171,
        'height': 130
    }

    image = sct.grab(region)
    mss.tools.to_png(image.rgb, image.size, output='loot1.png')

rawImage = cv2.imread('test3.png') 
hsv = cv2.cvtColor(rawImage, cv2.COLOR_BGR2HSV)
lower_white = np.array([0,0,230])
higher_white = np.array([255,255,255])
white_range = cv2.inRange(hsv, lower_white, higher_white)



data = pytesseract.image_to_string(white_range, lang='eng',config='--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789')

numbers = [
    int(m)
    for line in data.splitlines()
    if (m := "".join(ch for ch in line if ch.isdigit())).isnumeric()
]  
cv2.imshow("White", white_range)
cv2.waitKey()

    
print(numbers)

编辑:设法获得带有黑色文本的白色图像。我增强了图像并设法使其模糊。

在此处输入图像描述

到目前为止我的代码。

with mss.mss() as sct:
    region = {
        'left': 3577,
        'top': 146,
        'width': 171,
        'height': 130
    }

    image = sct.grab(region)
    mss.tools.to_png(image.rgb, image.size, output='loot1.png')

    rawImage = cv2.imread('test4.png')

    
    # Make Image bigger
    scale_percent = 260 # percent of original size
    width = int(rawImage.shape[1] * scale_percent / 100)
    height = int(rawImage.shape[0] * scale_percent / 100)
    dim = (width, height)
    resized = cv2.resize(rawImage, dim, interpolation = cv2.INTER_AREA)
    
    #Thin the numbers
    kernel = np.ones((2, 2), np.uint8)
    rawImage = cv2.erode(resized, kernel)
    
    #Find the white and remove everything else
    hsv = cv2.cvtColor(resized, cv2.COLOR_BGR2HSV)
    lower_white = np.array([0,0,235])
    higher_white = np.array([255,255,255])
    white_range = cv2.inRange(hsv, lower_white, higher_white)
    white_range = cv2.bitwise_not(white_range)

    #Blur image
    ksize = (9,9)
    white_range = cv2.blur(white_range,ksize)

    #Sharpen image
    # sharp = np.array([[-1,-1,-1],
    #                   [-1,9,-1],
    #                   [-1,-1,-1]])
    # sharp2 = cv2.filter2D(white_range, -1, sharp)

    data = pytesseract.image_to_string(white_range, lang='eng',config='--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789')

numbers = [
    int(m)
    for line in data.splitlines()
    if (m := "".join(ch for ch in line if ch.isdigit())).isnumeric()
]  
cv2.imshow("White", white_range)
cv2.waitKey()

    
print(numbers)

然而锐化并没有奏效。如果我使用这段代码来尝试锐化它,它就会被破解。

sharp = np.array([[-1,-1,-1],
[-1,9,-1],
[-1,-1,-1]])
sharp2 = cv2.filter2D(white_range, -1, sharp)

像这样

锋利后裂开

使用阵列进行锐化通常会使图片完全变黑。就像将 9 更改为 4 = 黑屏一样。关于我如何从这里开始的任何帮助?

标签: pythontesseractcv2

解决方案


只需反转图像:

在此处输入图像描述

当我运行 tesseract 时:

tesseract inverted.png -

我得到了这个结果:

164 609
709794
2 259

推荐阅读