使用opencv从验证码中提取字母

我试图从一个特别烦人的验证码中检索字母。

我正在尝试使用opencv2来做到这一点,到目前为止,它并没有给我带来惊人的结果。我可能没有完成正确的操作。


慕容708150
浏览 116回答 2
2回答

子衿沉夜

使用此代码,您可以获得验证码中的每个字母。def inverte(imagem, name):     imagem = (255 - imagem)     cv2.imwrite(name, imagem) imagem = cv2.imread(image_file) inverte(imagem, '2.png') image_file = '2.png'image = cv2.imread(image_file) image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) image = cv2.copyMakeBorder(image, 20, 20, 20, 20, cv2.BORDER_REPLICATE) thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1] contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) letter_image_regions = []for contour in contours:     (x, y, w, h) = cv2.boundingRect(contour)    if w / h > 1.25:         half_width = int(w / 2)         letter_image_regions.append((x, y, half_width, h))         letter_image_regions.append((x + half_width, y, half_width, h))    else:         letter_image_regions.append((x, y, w, h)) letter_image_regions = sorted(letter_image_regions, key=lambda x: x[0])for letter_bounding_box in letter_image_regions:     x, y, w, h = letter_bounding_box     letter_image = image[y - 2:y + h + 2, x - 2:x + w + 2]     letter_image = resize_to_fit(letter_image, 20, 20)     letter_image = np.expand_dims(letter_image, axis=2)     letter_image = np.expand_dims(letter_image, axis=0)

梵蒂冈之花

这是调整大小以适应功能import cv2import imutilsdef resize_to_fit(image, width, height):    # grab the dimensions of the image, then initialize    # the padding values    (h, w) = image.shape[:2]    # if the width is greater than the height then resize along    # the width    if w > h:        image = imutils.resize(image, width=width)    # otherwise, the height is greater than the width so resize    # along the height    else:        image = imutils.resize(image, height=height)    # determine the padding values for the width and height to    # obtain the target dimensions    padW = int((width - image.shape[1]) / 2.0)    padH = int((height - image.shape[0]) / 2.0)    # pad the image then apply one more resizing to handle any    # rounding issues    image = cv2.copyMakeBorder(image, padH, padH, padW, padW,                               cv2.BORDER_REPLICATE)    image = cv2.resize(image, (width, height))    # return the pre-processed image    return image
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python