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

Posted

技术标签:

【中文标题】检测具有轮廓的文本区域后从图像中提取文本【英文标题】:Text Extraction from image after detecting text region with contours 【发布时间】:2018-07-13 19:20:13 【问题描述】:

我想在 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

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

【问题讨论】:

ps 在您发现成千上万的人以您的名义打开信用卡或收到交通罚款之前,您可能需要隐藏其中的一些数字 没关系,它只是一个谷歌图像:-p 【参考方案1】:

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

字母 = I[y:y+h, x:x+w]

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

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

您如何处理不正确/太粗粒度的文本检测(例如 DEPARTMENT 中的“DE”或“RT”)将会很有趣。 Andrew NG 在他的 Coursera Course for Machine Learning 中建议使用 ML 模型来检测字母之间的间隙并以此分割。

【讨论】:

谢谢。我会开始做这个。希望我能实现我的目标。

以上是关于检测具有轮廓的文本区域后从图像中提取文本的主要内容,如果未能解决你的问题,请参考以下文章

使用 Opencv 检测图像中的文本区域

在 GIMP 中如何在文本周围添加边框 | Linux 中国

一种基于连通分量的文本区域定位方法

如何使标签文本轮廓化并适合标签的大小

检测屏幕截图中的文本区域

创建具有自动调整大小的文本区域