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

3
我有一张样本图像,看起来像这样: 可能会出现一个或多个水平线分隔文本部分。我想要得到四个文本块,看起来像这样: 水平线可能靠近文本,而且外部矩形不总是存在。
我尝试了以下操作: - 阈值化 - 腐蚀和膨胀 - 查找轮廓
由于水平线靠近文本,没有干净的方法可以通过腐蚀和膨胀来获取上下文本。有时候它可以工作,有时候它取决于线与文本的接近程度。
我阅读过使用直方图可以识别水平线并始终一致地识别文本块。有关如何完成此操作的任何提示?

膨胀+XYCut应该效果不错。很抱歉我没有Python实现;D - Miki
1个回答

2

检测霍夫线->黑色化线条->膨胀。

代码

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)

输出

在此输入图片描述


(注:本段内容为HTML代码,无需翻译)

谢谢。我对它进行了一些更改,以使其适用于其他示例。我使用了boundingRect而不是minAreaRect。仍然存在一个问题,我希望以人类读物的方式读取文本。但是,通过轮廓循环遍历并不能维持这种顺序。有什么想法吗? - JoeD
得到一个通用的算法是很困难的。你可以遵循的一种基本方法是将页面分成某些区域,然后从属于特定区域的轮廓开始。 - Arijit
有没有一种方法可以基于HoughLinesP识别的水平线来识别区域,如果没有水平线,则整列? - JoeD
在您提供的图像中,检测到的线条无法提供获取轮廓序列的详细信息:/。尝试不同的方法。 - Arijit
@Arijit,你有没有一篇描述你分享的算法的研究论文?为了更深入地了解算法背后的原理、限制以及未来的工作等。 - Siva Patibandla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接