【问题标题】:Remove circles from technical drawing image从技术绘图图像中删除圆圈
【发布时间】:2020-03-01 22:29:34
【问题描述】:

在对技术绘图进行 OCR 时,大多数(全部?)ocr 引擎在周围几何图形方面存在问题,有时会将线条错误地解释为字母。

为了提高 OCR 的质量,我首先想从图像中删除某些元素,主要是圆形和矩形。

这些图纸都是黑白的,看起来与下面的示例非常相似。

实现这一目标的最佳方法是什么?我玩过 image magick 和 opencv,但收效甚微……

【问题讨论】:

    标签: opencv image-processing imagemagick ocr image-manipulation


    【解决方案1】:

    这是部分解决方案。这个问题可以分为两步:

    1) 通过删除水平线+垂直线来删除矩形

    我们创建垂直和水平内核,然后执行 morph close 以检测线条。从这里我们使用按位运算来删除这些行。

    检测到的垂直线(左)和水平线(右)

    删除的行

    import cv2
    
    image = cv2.imread('1.jpg')
    
    vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,15))
    remove_vertical = 255 - cv2.morphologyEx(image, cv2.MORPH_CLOSE, vertical_kernel)
    
    horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15,1))
    remove_horizontal = 255 - cv2.morphologyEx(image, cv2.MORPH_CLOSE, horizontal_kernel)
    
    result = cv2.add(cv2.add(remove_vertical, remove_horizontal), image)
    
    cv2.imshow('result', result)
    cv2.waitKey()
    

    2) 检测/删除圈子

    有几种方法可以去除圆圈

    1. 使用cv2.HoughCircles()。这是detect circles in images using Hough Circles的一个很好的教程
    2. 使用cv2.getStructuringElement() 构造一个cv2.MORPH_ELLIPSE 内核,然后执行morphological operations 以隔离圆形轮廓
    3. 使用简单的形状检测和轮廓近似和轮廓过滤来检测圆形。此方法使用cv2.arcLength()cv2.approxPolyDP() 进行轮廓逼近。这种方法的一个权衡是它只适用于“完美”的形状。看看detect simple geometric shapesopencv shape detection

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多