我用python拼凑了一个快速算法,从手写发票中获取输入框。你知道吗
# some preprocessing
img = np.copy(orig_img)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
img = cv2.GaussianBlur(img,(5,5),0)
_, img = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# get contours
contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for i, cnt in enumerate(contours):
approx = cv2.approxPolyDP(cnt, 0.01*cv2.arcLength(cnt,True), True)
if len(approx) == 4:
cv2.drawContours(orig_img, contours, i, (0, 255, 0), 2)
在本例中,由于笔迹跨越了方框边界,因此无法获取第二个笔迹。你知道吗
请注意,这张照片可以用手机拍摄,因此纵横比可能有点滑稽。你知道吗
那么,有什么妙方可以解决我的问题呢?
作为奖金。这些盒子是A4版的,里面有很多其他的东西。你能推荐一个完全不同的方法来把手写的数字拿出来吗?你知道吗
编辑
这可能很有趣。如果我不过滤四边多边形,我得到的轮廓,但他们都是手绘数字。也许有一种方法可以使轮廓具有水一样的内聚力,这样当它们接近自己的时候就会收缩?你知道吗
进一步编辑
这是没有边界框的原始图像
下面是一个可能的解决方案:
获得二值图像。我们加载图像,转换为灰度,应用高斯模糊,然后使用大津阈值
检测水平线。我们创建一个水平内核并将检测到的水平线绘制到掩码上
检测垂直线。我们创建一个垂直内核并将检测到的垂直线绘制到掩码上
执行形态学打开。我们创建一个矩形内核并执行变形打开以平滑噪声并分离任何连接的轮廓
找到轮廓,绘制矩形,并提取ROI。我们找到轮廓,并将边框绘制到图像上
以下是每个步骤的可视化:
二值图像
检测到画在遮罩上的水平线和垂直线
形态开口
结果
单个提取保存的ROI
注意:要仅从每个ROI中提取手写的数字/字母,请查看Remove borders from image but keep text written on borders (preprocessing before OCR)中以前的答案
代码
因为正方形有一条很直的直线,所以最好使用霍夫变换:
1-使图像灰度化,然后对其执行大津阈值,然后反转二值图像
2-Do Hough变换(
HoughLinesP
)并在新图像上绘制线3-使用
findContours
和drawContours
,使3 roi干净4-稍微腐蚀最终图像,使盒子更整洁
我用C++编写代码,很容易转换为Python:
感谢那些分享解决方案的人。我最终选择了一条稍有不同的道路。你知道吗
如果有人感兴趣,下面是代码(除了步骤5-那只是基本的numpy操作)
这是一个从原始图像中删除边界框的例子。你知道吗
相关问题 更多 >
编程相关推荐