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

How to split noise and text from the image for preprocessing of OCR

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

这是原始图片:

并且,预处理图像:

OCR结果为:Sicemn clone

如上图所示,字母周围有一些 "fog" 残留物,妨碍 OCR 模块正常工作。

是否有任何方法可以通过编程方式识别那些 "fog" 以从预处理图像中移除或对 remove/reduce 进行一些图像处理?

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

非常欢迎任何建议。


更新

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

无效案例示例:

结果示例:

看来,高斯滤波器似乎会导致此类镜头出现问题。 这意味着,不同的镜头可能需要不同的方法。

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

方法如下:

  1. 我首先将原始图像转换为灰度
  2. 应用高斯模糊(9x9 内核)对灰度图像进行去噪
  3. Top Hat Morphological operation (3x3 kernel)得到白色文本
  4. Otsu 阈值法
  5. 扩张
  6. 反转二进制阈值以获得黑色的白色文本

我终于得到了下图

作为 OCR 结果,此文本给出:"Since vou don'k"

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

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)

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

tesseract output.png stdout