【问题标题】:Remove borders from image but keep text written on borders (preprocessing before OCR)从图像中删除边框,但将文本保留在边框上(OCR 之前的预处理)
【发布时间】:2020-01-24 19:26:16
【问题描述】:

拥有如上图这样的图像,我可以将其裁剪成四个方形框,使用 OpenCV 形态学操作(基本膨胀、腐蚀)去除边框并得到如下结果:

在大多数情况下效果很好,但如果有人越界写,这可能会被预测为 7 而不是 2。

我很难找到一种解决方案,该解决方案可以在删除边框的同时恢复写在线条上的字符部分。我拥有的图像已经转换为灰度,因此我无法根据颜色区分书写数字。解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: python opencv image-processing computer-vision ocr


    【解决方案1】:

    这是一个管道

    • 将图像转换为灰度
    • Otsu 获取二值图像的阈值
    • 删除垂直线
    • 删除水平线
    • 构建修复内核和修复镜像
    • 反转图像

    转为灰度后,我们大津的阈值

    从这里我们删除垂直线

    然后去掉水平线

    这给我们留下了字符的空白,为了解决这个问题,我们创建了一个修复内核来扩大图像

    接下来我们使用阈值图像来保持我们的角色细节

    差距仍然存在,但要好一些。我们执行 morph close 以缩小差距

    它现在已经关闭,但我们丢失了角色细节。我们使用阈值图像执行最终的逐位和以恢复我们的细节

    为了得到想要的结果,我们反转图像

    import cv2
    
    image = cv2.imread('1.png')
    removed = image.copy()
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
    
    # Remove vertical lines
    vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,40))
    remove_vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
    cnts = cv2.findContours(remove_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    for c in cnts:
        cv2.drawContours(removed, [c], -1, (255,255,255), 15)
    
    # Remove horizontal lines
    horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40,1))
    remove_horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
    cnts = cv2.findContours(remove_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    for c in cnts:
        cv2.drawContours(removed, [c], -1, (255,255,255), 5)
    
    # Repair kernel
    repair_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
    removed = 255 - removed
    dilate = cv2.dilate(removed, repair_kernel, iterations=5)
    dilate = cv2.cvtColor(dilate, cv2.COLOR_BGR2GRAY)
    pre_result = cv2.bitwise_and(dilate, thresh)
    
    result = cv2.morphologyEx(pre_result, cv2.MORPH_CLOSE, repair_kernel, iterations=5)
    final = cv2.bitwise_and(result, thresh)
    
    invert_final = 255 - final
    
    cv2.imshow('thresh', thresh)
    cv2.imshow('removed', removed)
    cv2.imshow('dilate', dilate)
    cv2.imshow('pre_result', pre_result)
    cv2.imshow('result', result)
    cv2.imshow('final', final)
    cv2.imshow('invert_final', invert_final)
    cv2.waitKey()
    

    【讨论】:

    • 不错。谢谢。
    猜你喜欢
    • 2020-01-11
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2012-02-13
    相关资源
    最近更新 更多