使用日期位于右下角的信息,我们可以估计它的位置。接下来,我们可以对图像进行上采样并执行颜色分割以进行准确识别,以使数字对人眼和 tesseract 都更加可见。最后,我们应用自适应阈值来提取和 OCR 字母。
步骤
-
估计日期位置:
-
-
如果将宽度分成 5 个相等的部分,则需要最后两部分和图像的高度从底部稍微向上:
-
-
如果我们对图像进行上采样:
-
-
现在图像可读且清晰。然而,黄色密集区域是 OCR 的阻塞伪影。
-
img = cv2.imread("QqLso.jpg")
(h, w) = img.shape[:2]
crp = img[h-30:h, int((3*w)/5):w]
crp = cv2.resize(crp, (0, 0), fx=5, fy=5)
-
颜色分割生成的蒙版
-
-
想法是删除不包含日期信息的区域。
-
hsv = cv2.cvtColor(crp, cv2.COLOR_BGR2HSV)
lwr = np.array([0, 102, 0])
upr = np.array([179, 255, 255])
msk = cv2.inRange(hsv, lwr, upr)
-
使用 bitwise_and 提取日期部分
-
-
现在我们有了日期信息,其中包含阻止日期和月份数据的工件。
-
res = 255 - cv2.bitwise_and(crp, crp, mask=msk)
-
应用自适应阈值
-
-
工件部分消失,图像适合提取 OCR。
-
crp_img = cv2.cvtColor(res, cv2.COLOR_HSV2BGR)
crp_gry = cv2.cvtColor(crp_img, cv2.COLOR_BGR2GRAY)
thr = cv2.adaptiveThreshold(crp_gry, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
cv2.THRESH_BINARY_INV, 31, 9)
-
tesseract-ocr 的结果
代码:
import cv2
import numpy as np
import pytesseract
# Estimate the position
img = cv2.imread("QqLso.jpg")
(h, w) = img.shape[:2]
crp = img[h-30:h, int((3*w)/5):w]
# Up-sample
crp = cv2.resize(crp, (0, 0), fx=5, fy=5)
# Create binary mask
hsv = cv2.cvtColor(crp, cv2.COLOR_BGR2HSV)
lwr = np.array([0, 102, 0])
upr = np.array([179, 255, 255])
msk = cv2.inRange(hsv, lwr, upr)
# Remove background
res = 255 - cv2.bitwise_and(crp, crp, mask=msk)
# Adaptive-threshold
crp_img = cv2.cvtColor(res, cv2.COLOR_HSV2BGR)
crp_gry = cv2.cvtColor(crp_img, cv2.COLOR_BGR2GRAY)
thr = cv2.adaptiveThreshold(crp_gry, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
cv2.THRESH_BINARY_INV, 31, 9)
# OCR
txt = pytesseract.image_to_string(thr)
print(txt)
# display
cv2.imshow("thr", thr)
cv2.waitKey(0)
要查找掩码的上下边界,您可能会发现有用:HSV-Threshold-script