这是一个简单的方法:
-
获取二值图像。加载图像,转换为灰度,然后Otsu的阈值,得到像素范围为[0...255]的1通道二值图像。
李>
检测水平和垂直线条。创建水平和垂直structuring elements,然后通过执行morphological operations在蒙版上绘制线条。
删除水平线和垂直线。 使用bitwise_or 操作组合水平和垂直蒙版,然后使用bitwise_and 操作删除线。
执行 OCR。 应用轻微的 Gaussian blur,然后使用 Pytesseract 进行 OCR。
这是每个步骤的可视化:
输入图像->二值图像->水平蒙版->垂直蒙版
组合蒙版-> 结果-> 应用轻微模糊
OCR 的结果
38
18
78
我使用 Python 实现了它,但您可以使用 Java 调整类似的方法
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
# Load image, grayscale, Otsu's threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# Detect horizontal lines
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25,1))
horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=1)
# Detect vertical lines
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,25))
vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=1)
# Remove horizontal and vertical lines
lines = cv2.bitwise_or(horizontal, vertical)
result = cv2.bitwise_not(image, image, mask=lines)
# Perform OCR with Pytesseract
result = cv2.GaussianBlur(result, (3,3), 0)
data = pytesseract.image_to_string(result, lang='eng', config='--psm 6')
print(data)
# Display
cv2.imshow('thresh', thresh)
cv2.imshow('horizontal', horizontal)
cv2.imshow('vertical', vertical)
cv2.imshow('lines', lines)
cv2.imshow('result', result)
cv2.waitKey()