【发布时间】:2019-09-08 22:12:43
【问题描述】:
我一直在尝试从表单文档中识别手写字母(数字/字母)。众所周知,表单文档有 1d 行单元格,申请人必须在这些有界单元格中填写他们的信息。但是,我无法从边界框中分割数字(目前我的输入仅包含数字)。
我经历了以下步骤:
- 通过opencv2的“imread”方法读取图像(作为灰度图像)。初始图片尺寸:19 x 209(以像素为单位)。
pic = "crop/cropped000.jpg"
newImg = cv2.imread(pic, 0)
- 通过 opencv2 的“resize”方法将图像大小调整为原始大小的 200%。我使用了 INTER_AREA 插值。调整后的图片尺寸:38 x 418(以像素为单位)
h,w = newImg.shape
resizedImg = cv2.resize(newImg, (2*w,2*h), interpolation=cv2.INTER_AREA)
- 应用 Canny 边缘检测。
v = np.median(resizedImg)
sigma = 0.33
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edgedImg = cv2.Canny(resizedImg, lower, upper)
- 裁剪轮廓并将它们作为图像保存在“BB”目录中。
im2, contours, hierarchy = cv2.findContours(edgedImg.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
num = 0
for c in contours:
x, y, w, h = cv2.boundingRect(c)
num += 1
new_img = resizedImg[y:y+h, x:x+w]
cv2.imwrite('BB/'+str(num).zfill(3) + '.jpg', new_img)
总结整个代码:
pic = "crop/cropped000.jpg"
newImg = cv2.imread(pic, 0)
h,w = newImg.shape
print(newImg.shape)
resizedImg = cv2.resize(newImg, (2*w,2*h), interpolation=cv2.INTER_AREA)
print(resizedImg.shape)
v = np.median(resizedImg)
sigma = 0.33
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edgedImg = cv2.Canny(resizedImg, lower, upper)
im2, contours, hierarchy = cv2.findContours(edgedImg.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
num = 0
for c in contours:
x, y, w, h = cv2.boundingRect(c)
num += 1
new_img = resizedImg[y:y+h, x:x+w]
cv2.imwrite('BB/'+str(num).zfill(3) + '.jpg', new_img)
生成的图像张贴在这里: https://imgur.com/a/GStIcdj
我不得不将图像尺寸加倍,因为 Canny 边缘检测会为一个对象产生双边缘(但是,它仍然会这样做)。我也玩过其他 openCV 功能,如阈值、高斯模糊、扩张、侵蚀,但都是徒劳的。
【问题讨论】:
标签: python-3.x opencv canny-operator handwriting-recognition