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

2024-05-13 20:58:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Example

Example2

下面的预处理似乎具有一定的准确性

    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)

Example

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


Tags: 字符串py图像数字cv2感兴趣ocr背景
1条回答
网友
1楼 · 发布于 2024-05-13 20:58:37

这里有一个解决方案,它基于asimilar post的思想。其主要思想是应用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 )

代码的第一位获取输入的二进制图像。请注意,我对通过大津获得的阈值添加了一些偏差,以避免角色降级。结果是:

好的,让我们应用命中或未命中操作来获得点掩码

# 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)

点掩码如下所示:

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

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

Text is: 6.003.722,09

另一个图像生成此最终结果:

它的OCR返回以下内容:

Text is: 4.705.640,00

相关问题 更多 >