从技术绘图图像中删除圆圈

Remove circles from technical drawing image

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

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

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

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

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

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) Detect/remove 圈子

有几种方法可以去除圆圈

  1. 使用cv2.HoughCircles(). Here's a good tutorial to detect circles in images using Hough Circles
  2. 构造一个cv2.MORPH_ELLIPSE内核使用cv2.getStructuringElement() then perform morphological operations来隔离圆轮廓
  3. 使用带有轮廓近似和轮廓过滤的简单形状检测来检测圆。此方法使用 cv2.arcLength()cv2.approxPolyDP() 进行轮廓近似。这种方法的一个权衡是它只适用于 "perfect" 形状。看看detect simple geometric shapes and opencv shape detection