使用opencv和python清除图像背景后如何正确提取字母?

时间:2018-11-20 14:12:38

标签: python opencv image-processing computer-vision ocr

我试图从opencv图像中分别提取字母,但是在某些情况下遇到困难。有时,他会捡起相同的字母并在中间分开。在某些情况下,例如字母“ i”,它无法识别该点并将其视为另一个字符。在应用腐蚀功能并搜索轮廓以提取字母之后,下面有3个输入图像示例。

Image example

我的代码段:

import cv2
import numpy as np
import imutils

img = cv2.imread('captchas/image.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU|cv2.THRESH_BINARY_INV)[1]

kernel = np.ones((5,4), np.uint8)

img_erode = cv2.erode(thresh, kernel, iterations = 1)

contours = cv2.findContours(img_erode.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

contours = contours[0] if imutils.is_cv2() else contours[1]

letter_image_regions = []

output = img_erode.copy()

for contour in contours:

    (x, y, w, h) = cv2.boundingRect(contour)

    if cv2.contourArea(contour) > 200:
        if w / h > 0.75:

            half_width = int(w / 2)
            cv2.rectangle(output, (x, y), (x + half_width, y + h), (70,0,70), 3)
            cv2.rectangle(output, (x, y), (x + w, y + h), (70,0,70), 3)
        else:

            cv2.rectangle(output, (x, y), (x + w, y + h), (70,0,70), 3)

cv2.imshow("Input", img)
cv2.imshow("Erode", img_erode)
cv2.imshow("Output", image)
cv2.waitKey(0)

1 个答案:

答案 0 :(得分:0)

字母Z被分隔一半的原因是这种情况if w / h > 0.75:,而您绘制cv2.rectangle(output, (x, y), (x + half_width, y + h), (70,0,70), 3)。因此,尝试找到更好的条件。

要获取整个字母i,请在morphologyEx()之后和erode()之前执行findContour()

kernel2 = np.ones((22,7), np.uint8)

morph_img = img_erode.copy()
cv2.morphologyEx(src=img_erode, op=cv2.MORPH_CLOSE, kernel=kernel2, dst=morph_img)

结果我得到了。您可以调整kernel2的大小以获得更好的效果。

enter image description here