如何从图像中分割噪声和文本以进行OCR的预处理

时间:2017-12-01 21:09:09

标签: c++ image ocr tesseract

我在电视镜头中对字幕应用OCR。 (我正在使用Tesseact 3.x w / C ++)我试图将文本和背景部分拆分为OCR的预处理。

这是原始图片:

enter image description here

并且,预处理的图像:

enter image description here

OCR结果是:Sicemn clone

如上面所示的预处理图像,有一些"雾"留在信中,阻止OCR模块正常工作。

有没有办法认识到那些"雾"以编程方式删除或进行一些图像处理以从预处理的图像中删除/减少它?

由于预处理逻辑经过大量优化以处理不同的图像,我宁愿找到一种方法来清理"预处理的图像,而不是修改预处理的逻辑(因为优化到这个图片可以影响到其他图片)

非常欢迎任何建议。

更新

显然,sixela的答案很棒,并且适用于大多数情况。 它不起作用的情况是背景也包括相似的文字颜色

不工作案例:

enter image description here

结果示例:

enter image description here

看起来,高斯滤波器似乎在这类镜头中引起了问题。 这意味着,不同的镜头可能需要不同的方法。

1 个答案:

答案 0 :(得分:1)

通过使用形态学操作和阈值处理,我设法获得了更清晰(不完美)的图像。

以下是:

  1. 我开始转换为灰度的原始图像
  2. 应用高斯模糊(9x9内核)对灰度图像进行去噪
  3. Top Hat形态操作(3x3内核)获取白色文本
  4. Otsu阈值法
  5. 扩张
  6. 反转二进制阈值以获取黑色白色文字
  7. 我终于获得了以下图片

    enter image description here

    作为OCR结果,本文给出了这样的文字:“自从你不知道”

    PS:这个结果当然可以通过调整参数(例如内核大小)来改进,但我希望它可以指导你。我在Python中使用OpenCv来快速尝试这些方法。

    x

    在此之后,我尝试使用此命令在Tesseract上输出图像:

    import cv2
    
    image = cv2.imread('./inputImg.png', 0)
    imgBlur = cv2.GaussianBlur(image, (9, 9), 0)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    imgTH = cv2.morphologyEx(imgBlur, cv2.MORPH_TOPHAT, kernel)
    _, imgBin = cv2.threshold(imgTH, 0, 250, cv2.THRESH_OTSU)
    
    imgdil = cv2.dilate(imgBin, kernel)
    _, imgBin_Inv = cv2.threshold(imgdil, 0, 250, cv2.THRESH_BINARY_INV)
    
    cv2.imshow('original', image)
    cv2.imshow('bin', imgBin)
    cv2.imshow('dil', imgdil)
    cv2.imshow('inv', imgBin_Inv)
    
    cv2.imwrite('./output.png', imgBin_Inv)
    cv2.waitKey(0)