gpt4 book ai didi

c++ - OpenCV 中文档的模式提取层

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:15 28 4
gpt4 key购买 nike

首先我们生成二进制文件通过在其 80% 的阈值处对给定图像进行阈值处理强度并反转生成的图像。在二进制图像中白色像素表示字符、 、图形和线条等。模式提取的第一步是定位矩形称为“矩形”的区域。矩形是松散的矩形区域连接的白色像素 1 , 包含一定的逻辑文档的一部分。我们考虑了简单的 8 邻域连接性和执行的连接组件(轮廓)二值图像的分析导致分割文本组件。对于算法的下一部分,我们使用轮廓的最小边界矩形。这些长方形然后使用从上到下和从左到右的顺序排序最左上角的二维点信息。更小基于假设丢弃连接模式它们可能是由于依赖于图像的噪声而产生的采集系统,不以任何方式有助于最终布局。标点符号也被忽略了较小的尺寸标准,例如逗号,句号等。在这个级别我们还根据边界的高度分离字体使用 avgh(平均高度)作为阈值的矩形。两个阈值用于将字体分为三类 - 小号、普通号和大。

equation http://a1.sphotos.ak.fbcdn.net/hphotos-ak-snc7/401374_144585198985889_100003032296249_180106_343820769_n.jpg

can you help me translate this theory into opencv source code or give me any related link for this, im currently working with document image analyzing for my thesis ....

最佳答案

我知道这是一个迟到的回复。但我认为 future 的人可以从中得到帮助。

下面是我认为我从上面的段落中理解的答案(所有代码都在 OpenCV-Python v 2.4-beta 中):

我将其作为输入图像。为了便于理解,这是一个简单的图像。

input image

First we generate the binary image of the give image by thresholding it at 80% of its intensity and inverting the resulting image.

import cv2
import numpy as np

img = cv2.imread('doc4.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,0.8*gray.max(),255,1)
contours, hier = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

阈值图像:

threshold image

We considered simple 8-neighborhood connectivity and performed connected component (contour) analysis of the binary image leading to the segmentation of the textual components.

它只是OpenCV中的轮廓查找,也称为connected-component labelling.它选择图像中的所有白色 Blob (组件)。

contours, hier = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

轮廓:

contours

For next part of algorithm we use the minimum bounding rectangle of contours.

现在我们在每个检测到的轮廓周围找到边界矩形。然后去掉小面积的轮廓,去掉逗号等。看语句:

Smaller connected patterns were discarded based on the assumption that they may have originated due to noise dependent on image acquisition system and does not in any way contribute to the final layout. Also punctuation marks were neglected using smaller size criterion e.g. comma, full-stop etc.

我们还找到了平均高度,avgh .

height = 0
num = 0
letters = []
ht = []

for (i,cnt) in enumerate(contours):
(x,y,w,h) = cv2.boundingRect(cnt)
if w*h<200:
cv2.drawContours(thresh2,[cnt],0,(0,0,0),-1)
else:
cv2.rectangle(thresh2,(x,y),(x+w,y+h),(0,255,0),1)
height = height + h
num = num + 1
letters.append(cnt)
ht.append(h)

avgh = height/num

所以在这之后所有逗号等都被删除,并在选定的周围绘制绿色矩形:

bounding rect

At this level we also segregate the fonts based on the height of the bounding rect using avgh (average height) as threshold. Two thresholds are used to classify fonts into three categories - small, normal and large (根据段落中给定的方程式)。

平均高度,avgh,这里得到的是40,所以一个字母是small如果高度小于 26.66(即 40x2/3),normal if 26.66large if height>60.但是在给定的图像中,所有高度都在 (28,58) 之间,所以都是正常的。所以你看不出区别。

所以我只是做了一个小修改,以便轻松地可视化它:如果 height<30 则小,如果 3050 则正常。

for (cnt,h) in zip(letters,ht):
print h
if h<=30:
cv2.drawContours(thresh2,[cnt],0,(255,0,0),-1)
elif 30 < h <= 50:
cv2.drawContours(thresh2,[cnt],0,(0,255,0),-1)
else:
cv2.drawContours(thresh2,[cnt],0,(0,0,255),-1)
cv2.imshow('img',thresh2)
cv2.waitKey(0)
cv2.destroyAllWindows()

现在您得到的结果是将字母分类为小号、普通号、大号:

result


These rectangles were then sorted top-to-bottom and left-to-right order, using 2D point information of leftmost-topmost corner.

这部分我已经省略了。它只是根据最左上角对所有边界矩形进行排序。

关于c++ - OpenCV 中文档的模式提取层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8655085/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com