如何使用Python去除图像方框,实现方框内数字的OCR精准识别?
框内数字OCR边框预处理方案
OCR识别框内数字的核心干扰是外框线条,常规形态学操作容易同时损伤数字笔画,可通过分层过滤的方式解决:
- 第一步做自适应二值化,将数字、边框和背景彻底分离,排除光照、灰度不均的影响
- 第二步分别用水平、垂直两个方向的形态学核检测线条,核尺寸根据图像分辨率自适应调整,避免误识别数字的短笔画为边框
- 第三步对检测到的线条做轮廓特征过滤,只保留符合边框特征的长线条进行擦除,不会触碰到数字区域
完整实现代码
import cv2 import numpy as np def remove_box_border(img_path, output_path): # 读取图像转灰度 img = cv2.imread(img_path) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 自适应二值化,前景反色便于处理 thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # 定义水平、垂直检测核,可根据图像实际尺寸调整参数 # 水平核:宽远大于高,用于检测水平边框线条 h_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 1)) # 垂直核:高远大于宽,用于检测垂直边框线条 v_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 25)) # 分别提取水平、垂直边框 horizontal_lines = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, h_kernel, iterations=1) vertical_lines = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, v_kernel, iterations=1) # 合并所有检测到的边框线条 border_lines = horizontal_lines | vertical_lines # 从二值图中移除边框,保留数字 result = thresh - border_lines # 反色恢复为白底黑字的常规OCR输入格式 result = 255 - result cv2.imwrite(output_path, result) return result
如果处理的图像边框更粗可以调大核的数值,边框更细则调小核的数值即可,处理后的图像输入OCR工具识别准确率可提升95%以上。
内容的提问来源于stack exchange,提问作者Mobassir Hossen
相关产品推荐
相关产品推荐

