2017-12-04 2 views
1

Ich bin neu in Python und OpenCV. Ich arbeite derzeit an OCR mit Python und OpenCV ohne Tesseract. Bis jetzt war ich erfolgreich bei der Erkennung des Textes (Zeichen und Ziffern), aber ich habe ein Problem, Raum zwischen Wörtern zu erkennen. Eg- Wenn das Bild sagt "Hallo John", dann erkennt hallo John aber kann nicht erkennen, Abstand zwischen ihnen, so ist meine Ausgabe "HelloJohn" ohne Leerzeichen zwischen ihnen.Meine Code zum Extrahieren von Kontur geht so (I alle notwendigen Module importiert haben, ist dies einer der Hauptmodul Extrahieren Kontur):Erkennung von Interword Space in OCR mit Python und OpenCV

imgGray = cv2.cvtColor(imgTrainingNumbers, cv2.COLOR_BGR2GRAY) 
imgBlurred = cv2.GaussianBlur(imgGray, (5,5), 0)       


imgThresh = cv2.adaptiveThreshold(imgBlurred,       
            255,         
            cv2.ADAPTIVE_THRESH_GAUSSIAN_C,  
            cv2.THRESH_BINARY_INV,     
            11,         
            2)          

cv2.imshow("imgThresh", imgThresh)  

imgThreshCopy = imgThresh.copy()   

imgContours, npaContours, npaHierarchy = cv2.findContours(imgThreshCopy,   
              cv2.RETR_EXTERNAL,     
              cv2.CHAIN_APPROX_SIMPLE)   

Danach I die extrahierten Konturen klassifizieren, die Ziffern und Zeichen sind. Bitte helfen Sie mir, Raum zwischen ihnen zu erkennen. Vielen Dank im Voraus, Ihre Antwort wäre sehr hilfreich.

+0

So haben Sie Ihre binäres Bild mit den Buchstaben darauf . Ein Ansatz wäre es, die Buchstaben mit [Erweiterung] (https://docs.opencv.org/3.3.0/d9/d61/tutorial_py_morphological_ops.html) wachsen zu lassen, bis naheliegende Zeichen verschmelzen, getrennte Wörter jedoch nicht. Dann haben Sie separate Blobs für jedes Wort. Die Konturen dieser Blobs würden jeweils eine Maske für ein einzelnes Wort sein, und Sie können das Originalbild mit jedem Blob einzeln maskieren, machen Sie einfach die OCR für separate Wörter. –

Antwort

2

Da Sie keine Beispielbilder gegeben haben, ich erzeugen nur ein einfaches Bild mit testen:

h, w = 100, 600 
img = np.zeros((h, w), dtype=np.uint8) 
font = cv2.FONT_HERSHEY_SIMPLEX 
cv2.putText(img, 'OCR with OpenCV', (30, h-30), font, 2, 255, 2, cv2.LINE_AA) 

Test image

Wie ich in den Kommentaren erwähnt, wenn Sie einfach dilate das Bild, dann Die weißen Bereiche werden erweitert. Wenn Sie dies mit einem Kernel tun, der groß genug ist, damit die Buchstaben in der Nähe verschmelzen, aber klein genug, dass die einzelnen Wörter nicht zusammenpassen, können Sie die Konturen jedes Wortes extrahieren und damit ein Wort für OCR-Zwecke maskieren.

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15, 15)) 
dilated = cv2.dilate(img, kernel) 

Dilated image

die Maske jedes Wort einzeln zu erhalten, finden nur die Konturen dieser größeren Blobs. Sie können die Konturen auch sortieren; vertikal, horizontal oder beides, so dass Sie die Wörter in der richtigen Reihenfolge erhalten. Hier, da ich nur eine einzige Zeile haben, werde ich irgendwie nur in der x Richtung:

contours = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[1] 
contours = sorted(contours, key=lambda c: min(min(c[:, :, 0]))) 

for i in range(len(contours)): 

    mask = np.zeros((h, w), dtype=np.uint8) 

    # i is the contour to draw, -1 means fill the contours 
    mask = cv2.drawContours(mask, contours, i, 255, -1) 
    masked_img = cv2.bitwise_and(img, img, mask=mask) 

    cv2.imshow('Masked single word', masked_img) 
    cv2.waitKey() 

    # do your OCR here on the masked image 

Word 1

Word 2

Word 3

+0

Vielen Dank, Ihr Code funktioniert ... Sie haben eine große Last von meinem Kopf entfernt, wieder danke :) –

+0

Können Sie mir helfen, den Code zu erweitern, wenn der Text in mehreren Zeilen statt nur einer Zeile eglike sind nur dieser Kommentar. –

+0

Ich schlage vor, einen ähnlichen Ansatz wie ich oben gemacht habe. Versuchen Sie, mit einem langen horizontalen Zeilenkernel zu erweitern: 'kernel = np.ones ((1, 100), dtype = np.uint8)' und sehen Sie, was Sie als Antwort erhalten. Dadurch erhalten Sie für jede Zeile eine Maske. Maskieren Sie einfach jede Zeile und wiederholen Sie dann die obigen Schritte für diese Zeile. –

Verwandte Themen