You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:27:03