检测带轮廓的文本区域后从图像中提取文本

Ars*_*mad 6 python opencv machine-learning image-processing computer-vision

我想在python中使用机器学习为图像构建OCR.我通过将其转换为灰度,应用otsu阈值来预处理图像.然后我使用轮廓找到文本区域并在其上绘制矩形框.但是如何在此之后提取检测到的文本.我不想使用pytesseract.我想用knn或SVM或CNN进行预测但我面临的主要问题是如何使用轮廓从图像中获取检测到的文本.

Image=cv2.imread('DL.png')
I=Image.copy()
i=Image.copy()
G_Image=cv2.cvtColor(Image,cv2.COLOR_BGR2GRAY)

#Otsu Thresholding
blur = cv2.GaussianBlur(G_Image,(1,1),0)
ret,th = cv2.threshold(blur,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
image, contours, hierarchy = cv2.findContours(th,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
#img = cv2.drawContours(Image, contours, -1, (0,255,0), 3)

for contour in contours:
        # get rectangle bounding contour
        [x, y, w, h] = cv2.boundingRect(contour)

        if h>20:
            continue

        # draw rectangle around contour on original image
        cv2.rectangle(I, (x, y), (x + w, y + h), (255, 0, 255), 0)
Run Code Online (Sandbox Code Playgroud)

以上是我写的代码. 这是在检测到的文本上形成轮廓矩形之后的输出图像

在此输入图像描述

现在,我如何仅使用这些检测到的区域并将它们发送到我的机器学习算法(KNN,SVM或CNN)以从图像中获取文本.

小智 6

要裁剪文本区域,您可以使用numpy切片(因为图像实际上是一个numpy数组):

letter = I [y:y + h,x:x + w]

在你的循环中,可以为每个字母创建一个新的numpy数组(裁剪图像).将这些中的每一个调整为例如28x28,并为流行的MNIST示例提供正确的形状.

对于进一步的想法,我可以推荐以下git-repo,它为手写字母创建一个ML模型: EMNIST

如何处理不正确/过于粗糙的文本检测(例如DEPARTMENT中的"DE"或"RT")将会很有趣.Andrew NG在他的机器学习课程中建议使用ML模型来检测字母之间的间隙并将它们分开.