平面图文本识别和OCR

时间:2018-09-20 14:50:29

标签: python opencv ocr tesseract

目标是使用文本识别方法(例如:OpenCV)为美国平面图图像创建边界框,然后将其输入文本阅读器(例如:LSTM或tesseract)中。

尝试了几种方法cv2.findContours和cv2.boundingRect方法,但是在很大程度上未能推广到不同类型的平面图(平面图的外观存在很大差异)。

例如,在应用cv2.findContours函数之前,使用灰度,自适应阈值,腐蚀和膨胀(具有各种迭代)的cv2.findContours会产生以下结果。请注意,卧室2和厨房未正确拾取。

Output Input

无法找到任何区域的其他示例:

enter image description here

对文本识别模型或清理程序有什么想法,最好是通过代码示例来提高文本识别模型的准确性?

1 个答案:

答案 0 :(得分:3)

此答案基于以下假设:图像彼此相似(例如图像的大小,壁厚,字母...)。如果不是,那么这不是一个好方法,因为您必须为每个图像更改阈值。话虽如此,我将尝试将图像转换为二进制图像并搜索轮廓。之后,您可以添加标准,例如身高,体重等,以过滤掉墙壁。之后,您可以在蒙版上绘制轮廓,然后对图像进行放大。这样会将彼此靠近的字母组合成一个轮廓。然后,您可以为所有轮廓创建边界框,即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()

结果:

enter image description here