如何使用 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 操作寻找您要消除的模式的想法。在这种情况下,图案是一个黑色(或白色,如果您反转图像),周围是互补色的像素。我还包括了一个带有一些偏差的阈值操作,因为一些字符很容易被破坏(你真的可以从更高分辨率的图像中获益)。这些是步骤:
- 通过颜色转换得到灰度图像
- 带偏差的阈值得到二值图像
- 应用具有一个中心像素目标内核的命中或未命中
- 利用前面操作的结果抑制原图的噪点
我们来看代码:
# 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)
点掩码是这样的:
原始二值图像减去(或XOR
ing)这个掩码的结果是这样的:
如果我 运行 PyOCR
上的反转(白色背景上的黑色文本)结果图像,我得到这个字符串输出:
Text is: 6.003.722,09
另一张图片产生了这个最终结果:
它的 OCR
returns 这个:
Text is: 4.705.640,00
我正在使用 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
这是一个解决方案,它基于
- 通过颜色转换得到灰度图像
- 带偏差的阈值得到二值图像
- 应用具有一个中心像素目标内核的命中或未命中
- 利用前面操作的结果抑制原图的噪点
我们来看代码:
# 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)
点掩码是这样的:
原始二值图像减去(或XOR
ing)这个掩码的结果是这样的:
如果我 运行 PyOCR
上的反转(白色背景上的黑色文本)结果图像,我得到这个字符串输出:
Text is: 6.003.722,09
另一张图片产生了这个最终结果:
它的 OCR
returns 这个:
Text is: 4.705.640,00