2016-08-22 1 views
1

Ich habe ein Beispielbild, das wie folgt aussieht:Wie erkennt man Textbereiche mit Histogramm?

Es könnte eine oder mehr horizontale Linien, die Textabschnitte zu trennen. Suche 4 Textteile zu erhalten, die wie folgt aussieht:

Die horizontalen Linien in der Nähe sein könnte, um den Text und das externe Rechteck ist nicht immer da.

ich folgendes versucht haben - Schwellen - Erodieren & Dilate - FindContours

Da die horizontale Linie auf den Text der Nähe ist, gibt es keine saubere Art und Weise zu erodieren und erweitern Sie den Text oben und unten zu bekommen die Linie. Manchmal funktioniert es und manchmal hängt es nicht von der Nähe der Linie zum Text ab.

Ich habe gelesen, dass mit Hilfe von Histogrammen die horizontale Linie erkannt werden kann und die Textstücke immer konsistent identifiziert werden. Gibt es Hinweise darauf, wie das gemacht werden kann?

+0

Dilation + [XYCut] (http://stackoverflow.com/a/35603061/5008845) sollte ziemlich gut funktionieren. Ich habe keine Python-Implementierung dafür, sorry; D – Miki

Antwort

0

Erkennen HougLines -> Black Out die Linien -> Dialate.

-Code

import cv2 
import numpy as np; 

im = cv2.imread("im.png") 

im_gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
ret,thresh = cv2.threshold(im_gray,127,255,cv2.THRESH_BINARY_INV) 

edges = cv2.Canny(im_gray,50,150,apertureSize = 3) 
minLineLength = 100 
maxLineGap = 100 
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap) 
for line in lines: 
    for x1,y1,x2,y2 in line: 
     cv2.line(thresh,(x1,y1),(x2,y2),(0),5) 


kernel = np.ones((3,3),np.uint8) 

thresh = cv2.dilate(thresh,kernel,iterations = 10) 





_,contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 
minArea=5000 #nothing 
for cnt in contours: 
    area=cv2.contourArea(cnt) 
    if(area>minArea): 
     rect = cv2.minAreaRect(cnt) 
     box = cv2.boxPoints(rect) 
     box = np.int0(box) 
     cv2.drawContours(im,[box],0,(0,0,255),2) 

cv2.imshow("thresh", im) 
cv2.imwrite('so_result.jpg',im) 
cv2.waitKey(0) 

Ausgabe

enter image description here

+0

Danke. Ich habe es ein wenig geändert, um mit anderen Beispielen zu arbeiten. Ich habe boundingRect anstelle von minAreaRect verwendet. Ein Problem, das immer noch besteht, ist, dass ich den Text so lesen möchte, wie der Mensch ihn lesen würde. Das Durchlaufen der Konturen behält diese Reihenfolge jedoch nicht bei. Irgendwelche Gedanken? – JoeD

+0

Einen verallgemeinerten Algorithmus zu bekommen wird schwierig sein. Ein grundlegender Ansatz, dem Sie folgen können, besteht darin, die Seite in bestimmte Zonen zu unterteilen. Dann können Sie mit Konturen beginnen, die zu bestimmten Zonen gehören. – Arijit

+0

Gibt es eine Möglichkeit, die Zonen anhand der von HoughLinesP identifizierten horizontalen Linien zu identifizieren, und wenn keine horizontalen Linien vorhanden sind, dann die gesamte Spalte? – JoeD