2016-08-22 20 views
1

私はこのようになりますサンプル画像を持っている:ヒストグラムを使ってテキスト領域を認識する方法は?

テキストセクションを区切る一つ以上の水平線があるかもしれません。私がどのように見えるテキストの4つのチャンクを取得するために探しています:

水平線は、テキストや外部の長方形に近いかもしれないことは常に存在ではありません。

私は、次の を試してみました - しきい値 - &拡張 をむしばむ - 水平線をテキストに近いのでFindContours

、上記および下記のテキストを取得するために浸食さと拡張する一切のクリーンな方法はありませんこの線。時にはそれが動作し、時々それはテキストへの線の近さに依存しません。

ヒストグラムを使用すると、水平線が認識され、テキストチャンクが常に一貫して識別されることが読み取れます。どのようにこれを行うことができますか?

+0

拡張術+ [XYCut](http://stackoverflow.com/a/35603061/5008845)はかなり良い動作するはずです。私はそのためのPythonの実装を持っていません、申し訳ありません; D – Miki

答えて

0

ホークラインの検出 - >ブラックアウトザライン - >ダイヤル。

コード

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

ありがとう。私はそれを他の例を扱うために少し変更しました。私はminAreaRectの代わりにboundingRectを使用しました。まだ存在する1つの問題は、人間がそれを読む方法でテキストを読んでみたいということです。しかし輪郭をループすることでその順序は維持されません。何かご意見は? – JoeD

+0

一般化されたアルゴリズムを取得するのは難しいでしょう。あなたが従うことができる1つの基本的なアプローチは、ページを特定のゾーンに分割することです。次に、特定のゾーンに属する輪郭から始めることができます。 – Arijit

+0

HoughLinesPによって識別される水平線に基づいてゾーンを特定する方法はありますか?水平線がない場合は、列全体が表示されますか? – JoeD

関連する問題