如何在opencv中分割手写和打印的数字而不丢失信息?

时间:2018-10-25 18:11:35

标签: python-3.x opencv image-processing computer-vision digits

我编写了一种算法,该算法可以检测打印的和手写的数字并将其分段,但是在删除外部矩形手写数字时,会使用滑雪图像包中的clear_border丢失该数字。任何防止信息的建议。

样品:
enter image description here

如何分别获得所有5个字符?

2 个答案:

答案 0 :(得分:6)

从图像中分割字符-

方法-

  1. 阈值图像(将其转换为BW)
  2. 进行扩张
  3. 检查轮廓是否足够大
  4. 查找矩形轮廓
  5. 获得ROI并保存字符

Python代码-

# import the necessary packages
import numpy as np
import cv2
import imutils

# load the image, convert it to grayscale, and blur it to remove noise
image = cv2.imread("sample1.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (7, 7), 0)

# threshold the image
ret,thresh1 = cv2.threshold(gray ,127,255,cv2.THRESH_BINARY_INV)

# dilate the white portions
dilate = cv2.dilate(thresh1, None, iterations=2)

# find contours in the image
cnts = cv2.findContours(dilate.copy(), cv2.RETR_EXTERNAL,
    cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]

orig = image.copy()
i = 0

for cnt in cnts:
    # Check the area of contour, if it is very small ignore it
    if(cv2.contourArea(cnt) < 100):
        continue

    # Filtered countours are detected
    x,y,w,h = cv2.boundingRect(cnt)

    # Taking ROI of the cotour
    roi = image[y:y+h, x:x+w]

    # Mark them on the image if you want
    cv2.rectangle(orig,(x,y),(x+w,y+h),(0,255,0),2)

    # Save your contours or characters
    cv2.imwrite("roi" + str(i) + ".png", roi)

    i = i + 1 

cv2.imshow("Image", orig) 
cv2.waitKey(0)

首先,我对图像进行阈值处理以将其转换为黑色n白色。我在图像和背景的白色部分得到的字符为黑色。然后,我将图像放大以使字符(白色部分)变粗,这将很容易找到合适的轮廓。然后使用find findContours方法查找轮廓。然后,我们需要检查轮廓是否足够大,如果轮廓不够大,则将其忽略(因为该轮廓是噪声)。然后使用boundingRect方法找到轮廓的矩形。最后,保存并绘制检测到的轮廓。

输入图像-

Input

阈值-

Thresh

已扩张-

Dilate

轮廓-

Contours

保存的字符-

char2 char0 char1 char3

答案 1 :(得分:4)

手写数字腐蚀/裁剪问题: 您可以在识别步骤中,甚至在图像改进步骤中(识别之前)解决此问题。

  • 如果仅裁剪了很小一部分数字(例如您的图像示例),就足以将图像填充1或2个像素,从而使分割过程变得容易。或者,即使在填充后,一些词素过滤器(膨胀)也可以改善您的手指。 (这些解决方案在Opencv中可用)
  • 如果裁剪了足够多的数字,则需要向用于数字识别算法的训练数据集添加数字的降级/裁剪模式(即具有所有可能裁剪情况的数字3。等)

字符分隔问题:

  • opencv提供的斑点检测算法可以很好地解决您的问题(为凹凸参数选择正确的值)

  • opencv还提供了轮廓检测器( canny()函数),它有助于检测角色的轮廓,然后您可以找到合适的边界(也由Opencv提供:< em> cv2.approxPolyDP(contour,..,..))框围绕每个字符