1

我正在尝试从框中提取手写字符。表格的扫描并不一致,因此框的宽度和高度也不是恒定的。

这是表格的一部分。

在此处输入图像描述

我目前的做法:
1. 提取水平线
2. 提取垂直线
3. 结合以上两个图像
4. 查找轮廓(使用opencv)

这种方法给了我大部分的盒子。但是,当方框中填充有“L”或“I”之类的字符时,字符中的垂直线也会作为垂直线提取的一部分被提取。因此轮廓也会变得混乱。
由于盒子是周期性排列的,有没有办法使用快速傅里叶变换提取盒子?

4

3 回答 3

1

我最近想出了一个处理这个确切问题的 python 包。
我称它为BoxDetect并在通过以下方式安装它之后:

pip install boxdetect

它可能看起来有点像这样(您需要针对不同的形式调整参数:

from boxdetect import config

config.min_w, config.max_w = (20,50)
config.min_h, config.max_h = (20,50)
config.scaling_factors = [0.4]
config.dilation_iterations = 0
config.wh_ratio_range = (0.5, 2.0)
config.group_size_range = (1, 100)
config.horizontal_max_distance_multiplier = 2


from boxdetect.pipelines import get_boxes

image_path = "dumpster/m1nda.jpg"
rects, grouped_rects, org_image, output_image = get_boxes(image_path, config, plot=False)

在此处输入图像描述

您可能想查看以下线程以获取更多信息:
如何检测所有用于在特定字段的表单中输入字母的框?

于 2020-06-07T21:59:30.983 回答
0

傅里叶变换是我最不想想到的。

我宁愿尝试使用霍夫线检测器来获得长线,或者像您一样使用边缘检测,但我会明确地重建网格,找到它们的间距和行/列的确切位置,从而找到每个单独的单元格。

于 2020-03-10T13:52:46.760 回答
0

您可以尝试按颜色选择手写字符。例子:

import cv2
import numpy as np
img=cv2.imread('YdUqv .jpg')
#convert to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
#color definition
color_lower = np.array([105,80,60])
color_upper = np.array([140,255,255])
# select  color objects
mask = cv2.inRange(hsv, color_lower, color_upper)
cv2.imwrite('hand.png', mask)

结果: 在此处输入图像描述

于 2020-06-19T17:16:25.650 回答