如何使用opencv集中和调整数字大小?

时间:2017-07-04 21:10:42

标签: python opencv numpy ocr mnist

我想要OCR一些扫描的表格(手工填写)。这是我第一次使用计算机视觉做一些严肃的事情。到目前为止,我能够找到包含日期字段数字的方块:

enter image description here

查看OpenCV附带的示例手写数字数据集,我看到数字已集中并调整为(20, 20)

enter image description here

由于这可能是一个相当常见的问题,我想知道该算法是否已在OpenCV(或numpyscipy等)中实施,所以我没有重新发明轮子。

问题是: Python中是否有内置管道来规范化样本?

2 个答案:

答案 0 :(得分:1)

内置管道不确定,但是你可以通过执行以下操作(根据我的评论)实现自己的管道,因为你已经有了轮廓:

获取轮廓的边界矩形(因此以其为中心)并裁剪该部分:

x,y,w,h = cv2.boundingRect(cnt)
imgCrop = img[x:(x+w), y:(y+h)]

将图像大小调整为所需大小(例如20 x 20):

imgResized = cv2.resize(imgCrop, (20,20))   

您还可以按照以下特定比率调整轴的大小:

imgResized = cv2.resize(imgCrop, (0,0), fx=0.5, fy=0.5)  

scipy(如this问题中所述):

imgResized = scipy.misc.imresize(imgCrop, 0.5)  

奖金:使用Python和OpenCV检查this关于基本图像处理的精彩教程,其中显示了调整大小的其他方法,考虑了宽高比和插值以获得更好的结果,从中提取:

imgResized = cv2.resize(imgCrop, (20,20), interpolation = cv2.INTER_AREA)

答案 1 :(得分:0)

我最终使用了这个功能:

def norm_digit(im):
    h, w = im.shape
    if h > w:
        top, left = round(h * 0.1), round((1.2 * h - w) / 2)
    else:
        top, left = round(w * 0.1), round((1.2 * w - h) / 2)

    return cv2.resize(
        cv2.copyMakeBorder(im, top, top, left, left, cv2.BORDER_CONSTANT), 
        (20, 20)
    )

输入是已经裁剪到数字轮廓边界框的图像。有一些角落的情况它没有覆盖,但看起来这可能是足够好的。