如何使用 opencv 集中和调整数字大小?
How to centralize and resize digits using opencv?
我想对一些扫描的表格(手工填写)进行 OCR。这是我第一次使用计算机视觉做一些严肃的事情。到目前为止,我能够找到包含日期字段数字的方块:
查看 OpenCV
附带的示例手写数字数据集,我看到数字集中并调整为 (20, 20)
:
因为这可能是一个相当普遍的问题,我想知道该算法是否已经在 OpenCV
(或 numpy
、scipy
等)中实现,所以我不知道不必重新发明轮子。
问题是:Python 中是否有内置管道以标准化样本?
内置管道不确定,但如果您已经有了轮廓,您可以通过执行以下操作(基于我的评论)来实现自己的管道:
获取轮廓的边界矩形(因此以它为中心)并裁剪该部分:
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)
Bonus:查看 this 关于使用 Python 和 OpenCV 进行基本图像处理的精彩教程,他们在其中展示了其他调整大小的方法,同时考虑了纵横比和插值以获得更好的结果,从中提取:
imgResized = cv2.resize(imgCrop, (20,20), interpolation = cv2.INTER_AREA)
我最终使用了这个功能:
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)
)
输入是一张已经裁剪到数字轮廓边界框的图像。它没有涵盖一些极端情况,但看起来这可能已经足够好了。
我想对一些扫描的表格(手工填写)进行 OCR。这是我第一次使用计算机视觉做一些严肃的事情。到目前为止,我能够找到包含日期字段数字的方块:
查看 OpenCV
附带的示例手写数字数据集,我看到数字集中并调整为 (20, 20)
:
因为这可能是一个相当普遍的问题,我想知道该算法是否已经在 OpenCV
(或 numpy
、scipy
等)中实现,所以我不知道不必重新发明轮子。
问题是:Python 中是否有内置管道以标准化样本?
内置管道不确定,但如果您已经有了轮廓,您可以通过执行以下操作(基于我的评论)来实现自己的管道:
获取轮廓的边界矩形(因此以它为中心)并裁剪该部分:
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)
Bonus:查看 this 关于使用 Python 和 OpenCV 进行基本图像处理的精彩教程,他们在其中展示了其他调整大小的方法,同时考虑了纵横比和插值以获得更好的结果,从中提取:
imgResized = cv2.resize(imgCrop, (20,20), interpolation = cv2.INTER_AREA)
我最终使用了这个功能:
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)
)
输入是一张已经裁剪到数字轮廓边界框的图像。它没有涵盖一些极端情况,但看起来这可能已经足够好了。