Как автоматически настроить порог для соответствия шаблону с opencv? - PullRequest
4 голосов
/ 27 января 2020

, поэтому я использую opencv для сопоставления с шаблоном, как показано ниже. Мне постоянно нужно возиться с визуальным сходством #THRESHOLD, потому что оно иногда не может обнаружить совпадения или возвращает слишком много совпадений. Это метод проб и ошибок, пока он не совпадает ровно с 1 элементом в позиции в документе. Интересно, есть ли способ каким-либо образом автоматизировать это?

Файл image.png представляет собой изображение документа в формате PDF. Файл template.png представляет собой изображение абзаца. Моя цель - найти все параграфы в документе pdf, и я хочу узнать, какая нейронная сеть здесь полезна.

import cv2
import numpy as np


img = cv2.imread("image.png");
gimg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
template = cv2.imread("template.png", cv2.IMREAD_GRAYSCALE);
w, h = template.shape[::-1]


result = cv2.matchTemplate(gimg, template, cv2.TM_CCOEFF_NORMED)

loc = np.where(result >= 0.36) #THRESHOLD
print(loc)

for pt in zip(*loc[::-1]):
        cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0,255,0), 3)

cv2.imwrite("output.png", img)

, поэтому, например, она будет искать каждое значение #THRESHOLD из 0 на 1.0 и вернуть пороговое значение, которое возвращает совпадение с одним прямоугольником (dr aws зеленое поле выше) на изображении.

Однако я не могу не чувствовать, что это очень исчерпывающе, или Есть ли более разумный способ узнать, что такое пороговое значение?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Поскольку было много комментариев и почти никаких ответов, я обобщу ответы для будущих читателей.

Во-первых, ваш вопрос почти идентичен Как определить параграфы в изображении текстового документа для несогласованной текстовой структуры в Python. Также эта тема, кажется, решает проблему, которую вы решаете: Простые способы обнаружения и обрезки блоков (абзацев) текста вне изображения?

Во-вторых, обнаружение абзацев в PDF не следует делать с сопоставлением с шаблоном , но с одним из следующих подходов:

  1. Использование детектора острых краев в сочетании с расширением и оптимизацией счета F1. Это часто используется для распознавания текста, как предложено fmw42.
  2. В качестве альтернативы, вы можете использовать Преобразование ширины штриха (SWT) , чтобы идентифицировать текст, который вы затем группируете в строки и, наконец, блокируете, то есть абзацы. Для OCR эти блоки могут быть затем переданы в Tesseract (как предложено fmw42)

Ключ в любой задаче OCR состоит в том, чтобы максимально упростить проблему обнаружения текста, удалив деструктивные функции изображения с помощью изменяя изображение по мере необходимости. Чем больше у вас есть информации об изображении, которое вы обрабатываете заранее, тем лучше: изменить цвета, оцифровку, пороговое значение, расширить, применить фильтры и т. Д. c.

Чтобы ответить на ваш вопрос о поиске наилучшего совпадения при сопоставлении с шаблоном: Оформить заказ ответ Натани о сопоставлении с шаблоном . По сути, это сводится к поиску максимального значения корреляции с использованием minMaxLo c. См. Этот отрывок из ответа Натанси:

    # Threshold resized image and apply template matching
    thresh = cv2.threshold(resized, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
    detected = cv2.matchTemplate(thresh, template, cv2.TM_CCOEFF)
    (_, max_val, _, max_loc) = cv2.minMaxLoc(detected) ```

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

0 голосов
/ 06 февраля 2020

Я бы просто изменил

loc = np.where(result == np.max(result))

, это дает мне лучшие подходящие позиции, и тогда я могу выбрать только одну, если я хочу ...

...