如何使用 cv2 从数字中删除斑点背景?

How to remove spotted background from numbers using cv2?

我正在使用 py-tesseract 对图像进行 OCR,如下所示,但我无法从未处理的图像中获得一致的输出。如何使用 cv2 减少斑点背景并突出显示数字以提高准确性?我也有兴趣在输出字符串中保留分隔符。

低于 pre-processing 似乎有一定的准确性

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (7, 7), 0)
    (T, threshInv) = cv2.threshold(blurred, 0, 255,
    cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)

使用 psm 获取输出 --6: 6.903.722,99

这是一个解决方案,它基于 . The main idea is to apply a Hit-or-Miss 操作寻找您要消除的模式的想法。在这种情况下,图案是一个黑色(或白色,如果您反转图像),周围是互补色的像素。我还包括了一个带有一些偏差的阈值操作,因为一些字符很容易被破坏(你真的可以从更高分辨率的图像中获益)。这些是步骤:

  1. 通过颜色转换得到灰度图像
  2. 带偏差的阈值得到二值图像
  3. 应用具有一个中心像素目标内核的命中或未命中
  4. 利用前面操作的结果抑制原图的噪点

我们来看代码:

# Imports:
import numpy as np
import cv2

 image path
path = "D://opencvImages//"
fileName = "8WFNvsZ.jpg"

# Reading an image in default mode:
inputImage = cv2.imread(path + fileName)

# Convert RGB to grayscale:
grayscaleImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2GRAY)

# Threshold via Otsu:
thresh, binaryImage = cv2.threshold(grayscaleImage, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# Use Otsu's threshold value and add some bias:
thresh = 1.05 * thresh
_, binaryImage = cv2.threshold(grayscaleImage, thresh, 255, cv2.THRESH_BINARY_INV )

第一位代码获取输入的二值图像。请注意,我为通过 Otsu 获得的阈值添加了一些偏差以避免降低字符质量。这是结果:

好的,让我们应用 Hit-or-Miss 操作来获得 dot mask:

# Perform morphological hit or miss operation
kernel = np.array([[-1,-1,-1], [-1,1,-1], [-1,-1,-1]])
dotMask = cv2.filter2D(binaryImage, -1, kernel)

# Bitwise-xor mask with binary image to remove dots
result = cv2.bitwise_xor(binaryImage, dotMask)

点掩码是这样的:

原始二值图像减去(或XORing)这个掩码的结果是这样的:

如果我 运行 PyOCR 上的反转(白色背景上的黑色文本)结果图像,我得到这个字符串输出:

Text is: 6.003.722,09

另一张图片产生了这个最终结果:

它的 OCR returns 这个:

Text is: 4.705.640,00