Слой извлечения образца для документов в OpenCV - PullRequest
2 голосов
/ 28 декабря 2011

Сначала мы генерируем двоичное изображение данного изображения, устанавливая пороговое значение на 80% его интенсивности и инвертируя полученное изображение.В двоичном изображении белые пиксели представляют символы, графику, линии и т. Д. Первым шагом в извлечении шаблона является определение прямоугольных областей, называемых «прямоугольными».Прямоугольник - это прямоугольная область слабо связанных белых пикселей 1 , которая охватывает определенную логическую часть документа.Мы рассмотрели простую 8-соседнюю связность и выполнили анализ связанного компонента (контура) двоичного изображения, что привело к сегментации текстовых компонентов.Для следующей части алгоритма мы используем минимальный ограничивающий прямоугольник контуров.Затем эти прямоугольники были отсортированы сверху вниз и слева направо, используя информацию о точках 2D левого самого верхнего угла.Меньшие связанные шаблоны были отброшены, исходя из предположения, что они могли возникнуть из-за шума, зависящего от системы получения изображения, и никоим образом не влияет на окончательную компоновку.Также знаками препинания пренебрегали, используя критерий меньшего размера, например запятую, точку остановки и т. Д. На этом уровне мы также разделяем шрифты на основе высоты ограничивающего прямоугольника, используя avgh (средняя высота) в качестве порога.Два порога используются для классификации шрифтов на три категории - маленькие, нормальные и большие.

уравнение http://a1.sphotos.ak.fbcdn.net/hphotos-ak-snc7/401374_144585198985889_100003032296249_180106_343820769_n.jpg

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

1 Ответ

3 голосов
/ 22 апреля 2012

Я знаю, что это поздний ответ.Но я думаю, что будущие посетители могут получить помощь от этого.

Ниже приведен ответ, который, я думаю, я понял из отрывка выше (Все коды в OpenCV-Python v 2.4-бета):

Я беруэто как входное изображение.Это простое изображение для понимания.

input image

First we generate the binary image of the give image by thresholding it at 80% of its intensity and inverting the resulting image.

import cv2
import numpy as np

img = cv2.imread('doc4.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,0.8*gray.max(),255,1)
contours, hier = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

с порогомimage:

threshold image

We considered simple 8-neighborhood connectivity and performed connected component (contour) analysis of the binary image leading to the segmentation of the textual components.

Это просто поиск контура в OpenCV, также называемый маркировка подключенных компонентов. Выбирает все белые пятна (компоненты) на изображении.

contours, hier = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

Контуры:

contours

For next part of algorithm we use the minimum bounding rectangle of contours.

Теперь мы находим ограничивающие прямоугольники вокруг каждого обнаруженного контура.Затем удалите контуры с небольшими участками, чтобы удалить запятые и т. Д. См. Утверждение:

Smaller connected patterns were discarded based on the assumption that they may have originated due to noise dependent on image acquisition system and does not in any way contribute to the final layout. Also punctuation marks were neglected using smaller size criterion e.g. comma, full-stop etc.

Мы также находим среднюю высоту, *1055*At this level we also segregate the fonts based on the height of the bounding rect using avgh (average height) as threshold. Two thresholds are used to classify fonts into three categories - small, normal and large (согласно заданным уравнениям в отрывке).

средняя высота, avgh, получено здесь 40. Таким образом, одна буква равна small, если высота меньше 26.66 (т.е. 40x2/ 3), normal, если 26,66 больше, если высота> 60.Но на данном изображении все высоты находятся между (28,58), поэтому все в норме.Так что вы не видите разницу.

Так что я просто сделал небольшую модификацию, чтобы легко визуализировать ее: маленький, если высота <30, нормальный, если 3050. </p>

for (cnt,h) in zip(letters,ht):
    print h
    if h<=30:
        cv2.drawContours(thresh2,[cnt],0,(255,0,0),-1)
    elif 30 < h <= 50:
        cv2.drawContours(thresh2,[cnt],0,(0,255,0),-1)
    else:
        cv2.drawContours(thresh2,[cnt],0,(0,0,255),-1)
cv2.imshow('img',thresh2)
cv2.waitKey(0)
cv2.destroyAllWindows()

Теперь вы получите результат с буквами, классифицированными на маленькие, нормальные,Large:

result


These rectangles were then sorted top-to-bottom and left-to-right order, using 2D point information of leftmost-topmost corner.

Эту часть я пропустил.Это просто сортировка всех ограничивающих ритов по их левому верхнему углу.

...