Распознавание текста плана этажа и распознавание текста - PullRequest
0 голосов
/ 20 сентября 2018

Цель состоит в том, чтобы создать ограничивающие рамки с использованием методов распознавания текста (например, OpenCV) для изображений плана этажа в США, которые затем можно подавать в программу чтения текста (например, LSTM или tesseract).

Несколько методовкоторые были опробованы cv2.findContours и cv2.boundingRect методы были предприняты попытки, но в значительной степени не удалось обобщить для различных типов поэтажных планов (есть большое отклонение в том, как выглядят поэтажные планы).

Например,Использование cv2.findContours с использованием градаций серого, адаптивных порогов, эрозии и расширения (с различными итерациями) перед применением функции cv2.findContours приведено ниже.Обратите внимание, что спальня 2 и кухня не подобраны правильно.

Output Input

Дополнительный пример, в котором не удается найти регионы:

enter image description here

Есть какие-нибудь мысли о моделях распознавания текста или процедурах очистки, которые повысят точность модели распознавания текста, желательно с примерами кода?

1 Ответ

0 голосов
/ 21 сентября 2018

Этот ответ основан на предположении, что изображения похожи друг на друга (например, их размер, толщина стен, буквы ...).Если это не так, это не будет хорошим подходом, потому что вам придется менять пороги для каждого изображения.При этом я бы попытался преобразовать изображение в двоичный файл и искать контуры.После этого вы можете добавить критерий, как рост, вес и т. Д., Чтобы отфильтровать стены.После этого Вы можете нарисовать контуры на маске, а затем расширить изображение.Это объединит буквы, расположенные близко друг к другу, в один контур.Затем вы можете создать ограничивающую рамку для всех контуров, которые являются вашей ROI.Затем вы можете использовать любое распознавание текста в этом регионе.Надеюсь, это поможет немного.Приветствия!

Пример:

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

...