2017-09-18 17 views
5

Tôi đang cố gắng xây dựng một hệ thống nhận dạng chữ viết tay bằng cách sử dụng python và opencv. Việc nhận dạng các ký tự không phải là vấn đề mà là phân đoạn. tôi có thành công:opencv - cắt xén dòng viết tay (đoạn đường)

  • phân đoạn một từ vào ký tự đơn
  • phân đoạn một đơn câu vào từ theo thứ tự yêu cầu.

Nhưng tôi không thể phân đoạn các dòng khác nhau trong tài liệu. Tôi đã cố gắng phân loại các đường nét (để tránh phân đoạn đường và chỉ sử dụng phân đoạn từ) nhưng nó không hoạt động. Tôi đã sử dụng đoạn mã sau để từ phân khúc chứa trong một tài liệu viết tay, nhưng nó trả lời out-of-trật tự (nó trả lời theo cách sắp xếp từ trái sang phải):

import cv2 
import numpy as np 
#import image 
image = cv2.imread('input.jpg') 
#cv2.imshow('orig',image) 
#cv2.waitKey(0) 

#grayscale 
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) 
cv2.imshow('gray',gray) 
cv2.waitKey(0) 

#binary 
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV) 
cv2.imshow('second',thresh) 
cv2.waitKey(0) 

#dilation 
kernel = np.ones((5,5), np.uint8) 
img_dilation = cv2.dilate(thresh, kernel, iterations=1) 
cv2.imshow('dilated',img_dilation) 
cv2.waitKey(0) 

#find contours 
im2,ctrs, hier = cv2.findContours(img_dilation.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 

#sort contours 
sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0]) 

for i, ctr in enumerate(sorted_ctrs): 
    # Get bounding box 
    x, y, w, h = cv2.boundingRect(ctr) 

    # Getting ROI 
    roi = image[y:y+h, x:x+w] 

    # show ROI 
    cv2.imshow('segment no:'+str(i),roi) 
    cv2.rectangle(image,(x,y),(x + w, y + h),(90,0,255),2) 
    cv2.waitKey(0) 

cv2.imshow('marked areas',image) 
cv2.waitKey(0) 

Xin lưu ý rằng i am có thể phân khúc tất cả các từ đây nhưng chúng xuất hiện ra order.Is có cách nào để sắp xếp những đường nét theo thứ tự trên xuống dưới

HOẶC

phân khúc hình ảnh vào l riêng ines sao cho mỗi dòng có thể được phân đoạn thành các từ bằng cách sử dụng mã trên?

+0

tại sao bạn không sắp xếp nó theo x và y sau đó? – Tom

+0

Thực ra tôi đã thử điều đó nhưng nó chỉ dẫn đến việc sắp xếp lại hoàn toàn các đường nét một lần nữa. nó không trả về các đường bao theo đúng thứ tự. Tôi đã sắp xếp từ trái sang phải, tiếp theo là sắp xếp từ trên xuống, nhưng các đường nét không đúng thứ tự. Vì vậy, tôi nghĩ rằng mỗi dòng sẽ cần phải được tách ra. –

+0

Làm cho một danh sách sắp xếp đường nét dựa trên x, y là dễ nhất tôi muốn nói. Thêm một hình ảnh là bạn có thể. –

Trả lời

5

tôi đã phân đoạn cần thiết bằng cách làm cho một sự thay đổi mã ở trên vào dòng:

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

tôi đã thay đổi nó để:

kernel = np.ones((5,100), np.uint8) 

Bây giờ tôi nhận được những kết quả như sau segmented lines of input text Điều này cũng hoạt động với hình ảnh văn bản viết tay với các dòng không hoàn toàn nằm ngang: