如何使用直方图识别文本区域?

问题描述:

我有它看起来像这样的样本图像:如何使用直方图识别文本区域?

有可能是,分隔文本部分的一个或多个水平线。我希望得到4块文字看起来像:

水平线可能接近文本和外部矩形并不总是存在。

我曾尝试以下 - 阈值 - 侵蚀&扩张 - FindContours

由于水平线接近文本中,存在侵蚀和扩张得到上面和下面的文字没有干净的方式该线。有时候它会起作用,有时它并不取决于文本的紧密程度。

我读到,使用直方图可以识别水平线,文本块始终保持一致。任何关于如何完成的指针?

+0

扩张+ [XYCut](http://*.com/a/35603061/5008845)应该工作还不错。我没有Python的实现,对不起; D – Miki

检测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