平面图文本识别与OCR

5
本项目的目标是使用文本识别方法(例如:OpenCV)为美国平面图像创建边界框,然后将其馈入文本阅读器(例如:LSTM或tesseract)。
已尝试过几种方法,如cv2.findContours和cv2.boundingRect方法,但在不同类型的楼层平面图上普遍失败(楼层平面图的外观存在广泛差异)。
例如,使用灰度、自适应阈值、腐蚀和膨胀(具有各种迭代次数)之后应用cv2.findContours函数的cv2.findContours方法结果如下。请注意,Bedroom 2和Kitchen没有被正确捕获。

Output Input

以下是一个无法找到任何区域的额外示例:

enter image description here

有没有关于文本识别模型或清理程序的想法,可以通过代码示例来提高文本识别模型的准确性?
1个回答

6
这个答案基于图像相似(如大小、墙壁厚度、字母等)的假设。如果不是这样,这种方法就不好用,因为你需要为每个图像更改阈值器。话虽如此,我建议将图像转换为二进制并搜索轮廓。之后,您可以添加诸如高度、重量等条件来过滤墙壁。然后,您可以在掩模上绘制轮廓,然后膨胀图像。这将将彼此靠近的字母合并成一个轮廓。然后,您可以为所有轮廓创建边界框,这是您的ROI。然后,您可以在该区域使用任何OCR。希望能对您有所帮助。干杯!
import cv2
import numpy as np

img = cv2.imread('floor.png')
mask = np.zeros(img.shape, dtype=np.uint8)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, threshold = cv2.threshold(gray,150,255,cv2.THRESH_BINARY_INV)
_, contours, hierarchy = cv2.findContours(threshold,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

ROI = []

for cnt in contours:
    x,y,w,h = cv2.boundingRect(cnt)
    if h < 20:
        cv2.drawContours(mask, [cnt], 0, (255,255,255), 1)

kernel = np.ones((7,7),np.uint8)
dilation = cv2.dilate(mask,kernel,iterations = 1)
gray_d = cv2.cvtColor(dilation, cv2.COLOR_BGR2GRAY)
_, threshold_d = cv2.threshold(gray_d,150,255,cv2.THRESH_BINARY)
_, contours_d, hierarchy = cv2.findContours(threshold_d,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

for cnt in contours_d:
    x,y,w,h = cv2.boundingRect(cnt)
    if w > 35:
        cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
        roi_c = img[y:y+h, x:x+w]
        ROI.append(roi_c)

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

在这里输入图片描述


(翻译者说明:此段内容为HTML代码,无需翻译,只需要保留原有格式即可)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接