2016-08-22 33 views
1

我有它看起來像這樣的樣本圖像:如何使用直方圖識別文本區域?

有可能是,分隔文本部分的一個或多個水平線。我希望得到4塊文字看起來像:

水平線可能接近文本和外部矩形並不總是存在。

我曾嘗試以下 - 閾值 - 侵蝕&擴張 - FindContours

由於水平線接近文本中,存在侵蝕和擴張得到上面和下面的文字沒有乾淨的方式該線。有時候它會起作用,有時它並不取決於文本的緊密程度。

我讀到,使用直方圖可以識別水平線,文本塊始終保持一致。任何關於如何完成的指針?

+0

擴張+ [XYCut](http://stackoverflow.com/a/35603061/5008845)應該工作還不錯。我沒有Python的實現,對不起; D – Miki

回答

0

檢測hougLines - >黑線 - > Dialate。

代碼

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) 

輸出

enter image description here

+0

謝謝。我改變了一下與其他例子一起工作。我使用了boundingRect而不是minAreaRect。仍然存在的一個問題是我想以人類閱讀的方式閱讀文本。但是循環遍歷輪廓並不能保持這個順序。有什麼想法嗎? – JoeD

+0

獲得一個通用的算法將是艱難的。您可以遵循的一種基本方法是將頁面劃分爲特定區域,然後您可以從屬於特定區域的輪廓開始。 – Arijit

+0

有沒有方法根據HoughLinesP標識的水平線標識區域,如果沒有水平線,那麼整列? – JoeD