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

时间:2018-02-03 11:57:43

标签: python opencv image-processing machine-learning 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)

以上是我写的代码。 This is the output image after contour rectangles are formed on detected text

enter image description here

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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

如何处理错误/过于粗糙的文本检测(例如" DE"或者" RT"在DEPARTMENT。 Andrew NG在他的机器学习课程中建议使用ML模型来检测字母之间的间隙并将它们分开。