首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MSER中用于识别OCR中文本行的合并区域

MSER中用于识别OCR中文本行的合并区域
EN

Stack Overflow用户
提问于 2018-02-05 04:35:37
回答 2查看 5K关注 0票数 7

我使用MSER识别MSER中的文本区域。我使用以下代码提取区域并将其保存为图像。目前,每个识别区域被保存为一个单独的图像。但是,我想将属于文本行的区域合并为单个图像。

代码语言:javascript
运行
复制
import cv2

img = cv2.imread('newF.png')
mser = cv2.MSER_create()


img = cv2.resize(img, (img.shape[1]*2, img.shape[0]*2))

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
vis = img.copy()

regions = mser.detectRegions(gray)
hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions[0]]
cv2.polylines(vis, hulls, 1, (0,255,0)) 

我怎样才能把属于一条线的图像缝在一起?我得到的逻辑做大部分将基于一些启发式的识别区域与附近的y坐标。

但是如何将这些区域合并到OpenCV中。我错过了这一点,因为我是openCV的新手。任何帮助都将不胜感激。

附加样本图像

所需的输出如下

另一条线

另一条线

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-05 05:55:17

也许像膨胀侵蚀这样原始的东西也能在你的情况下发挥作用?例如,如果我在原始图像上使用erode操作,然后是dilate操作,并且主要是在水平方向,例如:

代码语言:javascript
运行
复制
img = cv2.erode(img, np.ones((1, 20)))
img = cv2.dilate(img, np.ones((1, 22)))

其结果是:

所以如果我们把它画在原来的图像上,它就变成:

我没有像你一样调整原始图像的大小(可能是为了检测那些小的单独的点和东西)。并不理想(我不知道MSER是如何工作的),但是经过足够的调整,您甚至可以使用简单的连接组件检测吗?

票数 5
EN

Stack Overflow用户

发布于 2018-02-05 18:32:59

如果您对使用MSER特别感兴趣,那么,正如您所提到的,可以使用一种将区域与附近的y坐标相结合的启发式方法。下面的方法可能不是有效的,我将尝试优化它,但它可能会给您一个如何解决问题的想法。

  1. 首先,让我们绘制由MSER确定的所有bboxes: 坐标,bbox =mser.detectRegions(灰色)在bbox : x,y,w,h=bbox cv2.矩形(img,(x,y),(x + w,y+ h),(0,255,0),2) 这给了我们-

  1. 现在,从bboxes中可以很明显地看出,高度变化很大,即使是单行也是如此。因此,对于在一行中聚类边界框,我们必须给出一个间隔。我无法想出一些万无一失的方法,所以我使用了,它是给定的bboxes所有高度的一半,这对于给定的情况很好。 bboxes_list = list() h= list() bboxes_list.append: x,y,w,h= bbox bboxes_list.append(x,y,x+ w,y+ h) #创建包围框列表,每个bbox包含左、上、右下坐标heights.append(h)高度=排序(高度)#排序高度median_height =高度(高度)/2/2#找到中间高度的一半。
  2. 现在,为了对包围框进行分组,给定y-坐标的特定间隔(这里是中间高度),我正在修改曾经在堆栈溢出中找到的代码段(一旦找到源,我就会添加它)。这个函数接受一个列表以及一个特定的间隔作为输入,并返回一个组的列表,其中每个组包含在y坐标上的绝对差小于或等于该间隔的边界框。请注意,迭代/列表需要基于y坐标排序。 def石斑鱼(iterable,interval=2):prev = not group = [] for item in iterable: if not prev或abs(item1 - prev1) <= interval: group.append( item ) <=interval:group.append( item )else=item prev =item if组:收益率组
  3. 因此,在对包围框进行分组之前,需要根据y坐标对它们进行排序。分组后,我们遍历每个组,并确定绘制覆盖给定组中所有边界框所需的最小x坐标、最小y坐标、最大x坐标和最大y坐标。 bboxes_list =排序(bbox_mod,key=lambda k: k1) #根据y1坐标(左上坐标y) combined_bboxes =石斑鱼(bboxes_list,median_height) #分组: x_min = min( group,key=lambda k: k) # Find min of x1 x_max = max( Group,key=lambda k: k2)2 # Find of x2 y_min =min(组,key=lambda k: k1)1 # Find min of y1 y_max = max(group,key=lambda k: k3)3 # Find max of y2 cv2.矩形(img,(x_min,y_min),(x_max,y_max),(0,255,0),2) 最终的结果是-

再次,我想重申这样一个事实,即它们可能是进一步优化这种方法的方法。目的是给你一个如何解决这些问题的想法。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48615935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档