我正在尝试从框中提取手写字符。表格的扫描并不一致,因此框的宽度和高度也不是恒定的。
这是表格的一部分。
我目前的做法:
1. 提取水平线
2. 提取垂直线
3. 结合以上两个图像
4. 查找轮廓(使用opencv)
这种方法给了我大部分的盒子。但是,当方框中填充有“L”或“I”之类的字符时,字符中的垂直线也会作为垂直线提取的一部分被提取。因此轮廓也会变得混乱。
由于盒子是周期性排列的,有没有办法使用快速傅里叶变换提取盒子?
我正在尝试从框中提取手写字符。表格的扫描并不一致,因此框的宽度和高度也不是恒定的。
这是表格的一部分。
我目前的做法:
1. 提取水平线
2. 提取垂直线
3. 结合以上两个图像
4. 查找轮廓(使用opencv)
这种方法给了我大部分的盒子。但是,当方框中填充有“L”或“I”之类的字符时,字符中的垂直线也会作为垂直线提取的一部分被提取。因此轮廓也会变得混乱。
由于盒子是周期性排列的,有没有办法使用快速傅里叶变换提取盒子?
我最近想出了一个处理这个确切问题的 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)
您可能想查看以下线程以获取更多信息:
如何检测所有用于在特定字段的表单中输入字母的框?
傅里叶变换是我最不想想到的。
我宁愿尝试使用霍夫线检测器来获得长线,或者像您一样使用边缘检测,但我会明确地重建网格,找到它们的间距和行/列的确切位置,从而找到每个单独的单元格。
您可以尝试按颜色选择手写字符。例子:
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)