Я знаю, что это поздний ответ.Но я думаю, что будущие посетители могут получить помощь от этого.
Ниже приведен ответ, который, я думаю, я понял из отрывка выше (Все коды в OpenCV-Python v 2.4-бета):
Я беруэто как входное изображение.Это простое изображение для понимания.
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:
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)
Контуры:
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:
These rectangles were then sorted top-to-bottom and left-to-right order, using 2D point information of leftmost-topmost corner.
Эту часть я пропустил.Это просто сортировка всех ограничивающих ритов по их левому верхнему углу.