繁体   English   中英

在python中应用轮廓后如何从图像中提取文本?

[英]How to extract text from image after applying contour in python?

所以我在大图像上应用了轮廓并达到了图像的以下裁剪部分:

在此处输入图片说明

在此处输入图片说明

但是现在不使用任何机器学习模型,我如何实际将图像转换为文本变量? 我开始了解模板匹配,但我不明白如何从这里开始。 我确实在目录中存储了字母和数字的图像(根据它们的图像值命名),但是我如何匹配它们中的每一个并将文本作为字符串获取? 我不想使用任何 ML 模型或库,如 pyTesseract。

我将不胜感激任何帮助。

编辑:

我为模板匹配尝试过的代码。

def templateMatch(image):
    path = "location"

    for image_path in os.listdir(path + "/characters-images"):
        template = cv2.imread(os.path.join(path, "characters-images", image_path))
        template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)

        template = template.astype(np.uint8)
        image = image.astype(np.uint8)

        res = cv2.matchTemplate(template, image, cv2.TM_SQDIFF_NORMED)
        mn, _, mnLoc, _ = cv2.minMaxLoc(res)

        if res is not None:
            return image_path.replace(".bmp", "")


def match(image):
    plate = ""
    # mask = np.zeros(image.shape, dtype=np.uint8)
    # print(image.shape)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # print(image.shape)
    # print(image)
    thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

    cnts = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    (cnts, _) = contours.sort_contours(cnts, method="left-to-right")

    for con in cnts:
        area = cv2.contourArea(con)

        if 800 > area > 200:
            x, y, w, h = cv2.boundingRect(con)
            # cv2.drawContours(mask, [c], 1, (255, 0, 0), 2)
            temp = thresh[y:y+h, x:x+w]

            character = templateMatching(temp)

            if character is not None:
                plate += character

    return plate

如何将图像实际获取到文本变量? 我开始了解模板匹配,但我不明白如何从这里开始。

模板匹配用于在给定模板的图像中定位对象,而不是从图像中提取文本。 将模板与图像中对象的位置匹配将无助于将文本作为字符串获取。 有关如何应用动态比例变体模板匹配的示例,请查看如何隔离轮廓内的所有内容,对其进行缩放并测试与图像的相似性? Python OpenCV 线检测来检测图像中的 X 符号 我不明白为什么不想使用 OCR 库。 如果您想从图像中提取文本作为字符串变量,您应该使用某种类型的深度/机器学习。 PyTesseract 可能是最简单的。 这是使用 PyTesseract 的解决方案


想法是使用 Otsu 阈值获得二值图像,然后执行轮廓区域和纵横比过滤以提取字母/数字 ROI。 从这里开始,我们使用 Numpy 切片将每个 ROI 裁剪到空白蒙版上,然后使用 Pytesseract 应用 OCR。 这是每个步骤的可视化:

二进制图像

检测到的 ROI 以绿色突出显示

准备用于 OCR 的空白掩模上的隔离 ROI

我们使用--psm 6配置选项告诉 Pytesseract 假设一个统一的文本块。 在此处查看更多配置选项 Pytesseract 的结果:

XS NB 23

代码

import cv2
import numpy as np
import pytesseract

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

# Load image, create mask, grayscale, Otsu's threshold
image = cv2.imread('1.png')
mask = np.zeros(image.shape, dtype=np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Filter for ROI using contour area and aspect ratio
cnts = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.05 * peri, True)
    x,y,w,h = cv2.boundingRect(approx)
    aspect_ratio = w / float(h)
    if area > 2000 and aspect_ratio > .5:
        mask[y:y+h, x:x+w] = image[y:y+h, x:x+w]

# Perfrom OCR with Pytesseract
data = pytesseract.image_to_string(mask, lang='eng', config='--psm 6')
print(data)

cv2.imshow('thresh', thresh)
cv2.imshow('mask', mask)
cv2.waitKey()

一种选择是考虑字符周围的边界框并计算手头字符与训练集中字符之间的相关性分数。 您将保持最大的相关性分数。 (SAD、SSD、归一化灰度相关或汉明距离之一,如果您在二进制图像上工作)。

您将需要制定合适的策略以确保测试字符和学习字符具有兼容的大小并正确叠加。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM